django2外键,F表达式,Q表达式
一对多
环境
两个类:书的类别和文章,一片文章只能有一个作者,一个作者可以有多个文章,这之间组成了一对多的关系
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表达式的更多相关文章
- Django2 外键遇到的坑
# 出版社 class Publisher(models.Model): # 自增.主键 id id = models.AutoField(primary_key=True) # varchar(32 ...
- mysql之字段的修改,添加、删除,多表关系(外键),单表详细操作(增删改)
字段的修改.添加和删除 create table tf1( id int primary key auto_increment, x int, y int ); #修改 alter table tf1 ...
- 聚合函数与F/Q表达式
聚合函数 取名: field + __ + 聚合函数名字 ,如:price__avg:可传关键字参数修改名字:avg=Avg("price"): aggregate:不会返回一个 ...
- ORM( ORM查询13种方法3. 单表的双下划线的使用 4. 外键的方法 5. 多对多的方法 ,聚合,分组,F查询,Q查询,事务 )
必知必会13条 <1> all(): 查询所有结果 <2> get(**kwargs): 返回与所给筛选条件相匹配的对象,返回结果有且只有一个,如果符合筛选条件的对象超过一个或 ...
- Django---Django的ORM的一对多操作(外键操作),ORM的多对多操作(关系管理对象),ORM的分组聚合,ORM的F字段查询和Q字段条件查询,Django的事务操作,额外(Django的终端打印SQL语句,脚本调试)
Django---Django的ORM的一对多操作(外键操作),ORM的多对多操作(关系管理对象),ORM的分组聚合,ORM的F字段查询和Q字段条件查询,Django的事务操作,额外(Django的终 ...
- Django2.0里model外键和一对一的on_delete参数
在django2.0后,定义外键和一对一关系的时候需要加on_delete选项,此参数为了避免两个表里的数据不一致问题,不然会报错: TypeError: __init__() missing 1 r ...
- 77.Q表达式详解
Q表达式可以包裹查询条件,可以在多个条件之间进行操作:与或非等.Q表达式一般会放在filter()中进行使用,F表达式一般是放在update()中进行使用. 定义模型的models.py文件中,示例代 ...
- Django2.0之后使用外键时遇到 __init__() missing 1 required positional argument: 'on_delete'
1.Django2.0之后使用外键时遇到 __init__() missing 1 required positional argument: 'on_delete' 需要在外键创建时给on_dele ...
- 关于django2.0的外键关系新特性之on_delete!
Django2.0里model外键和一对一的on_delete参数 在django2.0后,定义外键和一对一关系的时候需要加on_delete选项,此参数为了避免两个表里的数据不一致问题,不然会报错: ...
随机推荐
- yum源加速,替换为阿里云镜像
问题 使用yum命令安装mysql时,发现下载速度很慢,于是决定换成阿里的yum源 解决方法 参考自:https://www.jianshu.com/p/b7cd2f9fb8b7 首先备份一下原先的y ...
- vijos2051 SDOI2019 快速查询
题目链接 吐槽 竟然让\(nlog\)的做法卡过去了.. 思路 因为\(1 \le q \le 10^5\),所以可以先对每个标准操作,所操作的位置进行重标号.这样所有的下标都是在\(10^5\)以内 ...
- vue_02day
目录 vue_02 表单指令: 条件指令: 循环指令: 前端数据库: 分隔符: 过滤器: 计算属性: 监听属性: vue编译不生效,闪烁 冒泡排序: vue_02 表单指令: <form act ...
- read articles list
done 如何通俗易懂地解释卷积: https://www.zhihu.com/question/22298352/answer/637156871 如何通俗易懂地理解卷积神经网路: http://w ...
- [LeetCode] 23. Merge k Sorted Lists 合并k个有序链表
Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity. E ...
- 用 cgroups 管理 cpu 资源
转自:http://xiezhenye.com/2013/10/用-cgroups-管理-cpu-资源.html 这回说说怎样通过 cgroups 来管理 cpu 资源.先说控制进程的 cpu 使用. ...
- linux操作记录
cd ~ 是返回根目录cd .. 跳转到上一页cd 目录 是跳转到目录文件 php -i | grep php.ini 是查看php.ini在哪个文件 vi 是查看文件内容,:i 是编辑文件内容 : ...
- Elasticsearch由浅入深(三)document的核心元数据、Id、_source元数据、全量替换、强制创建以及删除机制
document的核心元数据 document的核心元数据有三个:_index._type._id 初始化数据: PUT test_index/test_type/ { "test_cont ...
- EFCore代码实践
参考:https://www.cnblogs.com/Wddpct/p/6835574.html 控制台程序依赖注入参考:https://www.cnblogs.com/Wddpct/p/721920 ...
- 《Interest Rate Risk Modeling》阅读笔记——第一章:利率风险建模概览
目录 第一章:利率风险建模概览 思维导图 一些想法 第一章:利率风险建模概览 思维导图 一些想法 久期向量模型类似于研究组合收益的高阶矩. 久期向量模型用的是一般多项式表达高阶久期,试试正交多项式? ...