一对多

环境

两个类:书的类别和文章,一片文章只能有一个作者,一个作者可以有多个文章,这之间组成了一对多的关系

class Category(models.Model):
category = models.CharField(max_length=100) def __str__(self):
return self.category class Article(models.Model):
title = models.CharField(max_length=20,verbose_name='书名')
info = models.TextField(verbose_name='内容')
author = models.CharField(max_length=10, verbose_name='作者')
f = models.ForeignKey(to='Category',on_delete=models.CASCADE)#如果不想用article_set这种形式查找,可以使用related_name='articles',那么在视图one_to_many函数中就可以使用articles = category.articles.all()

添加文章

def add_article(request):
article = Article(title='钢铁是怎样炼成的',info='不知道',author='疯子')
article.f = Category.objects.get(id=1)
article.save()
return HttpResponse('添加文章成功')

通过书的类型查找文章

def one_to_many(request):
category = Category.objects.first()
articles = category.article_set.all()#all可以换成filter或者first
for i in articles:
print(i.title)
print(i.author)
print(i.content)
return HttpResponse('ok')

一对一

环境

如果一张表里面字段非常都可以考虑把一张表拆成2张表,这样在查询的时候比在一张表上查询速度快,例子:一个用户表,一个用户扩展信息表,这是一对一个关系,一个用户只能对应一个扩展信息,同样的道理,一个用户扩展信息只能对应一个用户

models.py内容

class Users(models.Model):
name = models.CharField(max_length=10)
# def __str__(self):
# return 'name:%s' % self.name class Users_Extend(models.Model):
school = models.CharField(max_length=100)
telephone = models.CharField(max_length=11)
extend_info = models.OneToOneField('Users', on_delete=models.CASCADE)

view视图

#通过用户查看用户的扩展信息
def one_to_one(request):
# users = Users(name='疯子')
# users.save()
# extend = Users_Extend(school='交通大学',telephone=120)
# extend.extend_info_id = 1
# extend.save()
extend = Users_Extend.objects.first()
print(extend.extend_info.name)
return HttpResponse('添加用户成功')

view视图

#通过扩展信息查看用户
def one_to_one(request):
users = Users.objects.first()
print(users.users_extend)
return HttpResponse('添加用户成功')

多对多

环境

一个文章可以有多个标签,一个标签也可以有多个文章,这样就形成了多对多的关联表,如果是多对多的表关联,就必须存在第三章表

models.py内容

class Article(models.Model):
title = models.CharField(max_length=20,verbose_name='书名')
info = models.TextField(verbose_name='内容')
author = models.CharField(max_length=10, verbose_name='作者')
# f = models.ForeignKey(to='Category',on_delete=models.CASCADE,related_name='articles')
tag = models.ManyToManyField('Tag')
def __str__(self):
return '(id:%s title:%s info:%s)' % (self.id, self.title,self.info) class Tag(models.Model):
tag = models.CharField(max_length=100) def __str__(self):
return 'tag:%s' % self.tag

view视图

def many_to_many(request):
# 插入一篇文章
# article = Article(title='水浒传',info='武松打虎',author='施耐庵')
# article.save() # 取出一个标签对象
# tag = Tag.objects.first() # 在标签里添加文章
# tag.article_set.add(article)
# tag.save()
#
# print(article,tag)
# return HttpResponse('写入文章分类成功') #查看第一个标签下面有什么文章
tag = Tag.objects.first()
article = tag.article_set.all()
print(article) #查看一个文章有什么标签
article = Article.objects.first()
tags = article.tag.all()
print(tags)
return HttpResponse('查看文章分类成功')

F表达式

如果有一个场景,将运维部门所有的员工工资全部涨1000块钱,那么传统的方法如下:这样的方式效率是比较低的,这种方式需要把所有员工的工资查找出来放入到python内存当中,然后循环每一个员工的工资做+=1000的操作,然后在保存回数据库当中,F表达式是用来优化ORM数据库的

models.py内容

class Employee(models.Model):
name = models.CharField(max_length=10)
salary = models.IntegerField()

传统方式

def employee(request):
# 传统加工资方式
users = Employee.objects.all()
for user in users:
user.salary += 1000
user.save()

F表达式

def employee(request):
# F表达式
# Employee.objects.update(salary=F("salary")+1000)
Employee.objects.filter(salary__lt=2200).update(salary=F("salary")+1000)
return HttpResponse('涨薪成功')

Q表达式

如果要查找工资是2200并且姓名是冯明可以用:Employee.objects.filter(salary=2200,name='冯明'),那么如果我想查找工资是2200或者姓名为肖龙的数据呢?这就需要借助Q表达式,Q表达式可以表示或的关系,具体实现如下:

def employee(request):
# Q表达式
res = Employee.objects.filter(salary=2200,name='冯明')
# res = Employee.objects.filter(Q(salary=2200)|Q(name='肖龙'))
print(res.values())
return HttpResponse('涨薪成功')

ORM转变的sql语句

from django.db import connection#查看sql语句的方法
from django.shortcuts import render,redirect,reverse
from .models import Article,Category,Users,Users_Extend,Tag,Employee
from django.http import HttpResponse
from django.db.models import F
from django.db.models import Q print(connection.queries)#查看sql语句

django2外键,F表达式,Q表达式的更多相关文章

  1. Django2 外键遇到的坑

    # 出版社 class Publisher(models.Model): # 自增.主键 id id = models.AutoField(primary_key=True) # varchar(32 ...

  2. mysql之字段的修改,添加、删除,多表关系(外键),单表详细操作(增删改)

    字段的修改.添加和删除 create table tf1( id int primary key auto_increment, x int, y int ); #修改 alter table tf1 ...

  3. 聚合函数与F/Q表达式

    聚合函数 取名: field + __ + 聚合函数名字 ,如:price__avg:可传关键字参数修改名字:avg=Avg("price"): aggregate:不会返回一个  ...

  4. ORM( ORM查询13种方法3. 单表的双下划线的使用 4. 外键的方法 5. 多对多的方法 ,聚合,分组,F查询,Q查询,事务 )

    必知必会13条 <1> all(): 查询所有结果 <2> get(**kwargs): 返回与所给筛选条件相匹配的对象,返回结果有且只有一个,如果符合筛选条件的对象超过一个或 ...

  5. Django---Django的ORM的一对多操作(外键操作),ORM的多对多操作(关系管理对象),ORM的分组聚合,ORM的F字段查询和Q字段条件查询,Django的事务操作,额外(Django的终端打印SQL语句,脚本调试)

    Django---Django的ORM的一对多操作(外键操作),ORM的多对多操作(关系管理对象),ORM的分组聚合,ORM的F字段查询和Q字段条件查询,Django的事务操作,额外(Django的终 ...

  6. Django2.0里model外键和一对一的on_delete参数

    在django2.0后,定义外键和一对一关系的时候需要加on_delete选项,此参数为了避免两个表里的数据不一致问题,不然会报错: TypeError: __init__() missing 1 r ...

  7. 77.Q表达式详解

    Q表达式可以包裹查询条件,可以在多个条件之间进行操作:与或非等.Q表达式一般会放在filter()中进行使用,F表达式一般是放在update()中进行使用. 定义模型的models.py文件中,示例代 ...

  8. Django2.0之后使用外键时遇到 __init__() missing 1 required positional argument: 'on_delete'

    1.Django2.0之后使用外键时遇到 __init__() missing 1 required positional argument: 'on_delete' 需要在外键创建时给on_dele ...

  9. 关于django2.0的外键关系新特性之on_delete!

    Django2.0里model外键和一对一的on_delete参数 在django2.0后,定义外键和一对一关系的时候需要加on_delete选项,此参数为了避免两个表里的数据不一致问题,不然会报错: ...

随机推荐

  1. Spring Boot 引入外部yml配置文件

    当需要在springboot中引用其他的yml文件时,需要在application.yml里配置 spring:     profiles:         include: email,xmyb   ...

  2. 在centos8搭建dhcp服务

    1.用这两个命令就可以安装成功 yum - y install dhcp yum -y install dhcp-server.x86_64 2.配置文件在 /etc/dhcp/dhcpd.conf ...

  3. 重装系统的jdk问题???

    重装系统了!!!! 之前因为不懂电脑,然后自己动手装了台台式机,简直太开心了,又自己装了个系统,一切都非常欢乐,来到了给电脑起名字的时候,我不知道有多少人会卡在起名字这里,但是我那个时候非常开心,就想 ...

  4. Vue插槽详解 | 什么是插槽?

    作者 | Jeskson 来源 | 达达前端小酒馆 什么是插槽?插槽的指令为v-slot,它目前取代了slot和slot-scope,插槽内容,vue实例一套内容分发的api,将slot元素作为承载分 ...

  5. [LeetCode] 904. Fruit Into Baskets 水果装入果篮

    In a row of trees, the i-th tree produces fruit with type tree[i]. You start at any tree of your cho ...

  6. GreenPlum 大数据平台--常用命令

    gpstate 命令 参数 作用 gpstate -b => 显示简要状态 gpstate -c => 显示主镜像映射 gpstart -d => 指定数据目录(默认值:$MASTE ...

  7. swagger Unable to render this definition

    Unable to render this definition The provided definition does not specify a valid version field. Ple ...

  8. react 16 Hooks渲染流程

    useState react对useState进行了封装,调用了mountState. function useState<S>( initialState: (() => S) | ...

  9. ng 打包给路径添加前缀

    1.ng build --base --href /前缀名/--common - chunk --output-hashing=all --optimization 2.更改ts和html中的路径,将 ...

  10. bizcharts 图表内容居中

    当图表内的数据只有一组时,会紧靠在y轴上,如下图: 想要图表的内容居中,解决方法分两种情况. 第一种:如果x轴是日期,则代码设置如下,图表的内容就居中了 const cols = { x: { ali ...