Django模型层实现多表关系创建和多表操作( 四 )


F与Q查询
F查询
F查询可以获得表中某个字段的数据值,尤其适合表中两个字段之间的比较运算,在操作字符类型的数据时,F不能直接做字符串的拼接,需要借助Concat和Value 。
from django.db.models import F# 1.查询卖出数量大于库存数量的书籍res = models.Book.objects.filter(sell_num__gt=F('inventory_num'))# 将所有书籍的价格提升20元res = models.Book.objects.update(price=F('price')+20)
F查询对于字符串的操作需要借助Concat和Value两个方法:
【Django模型层实现多表关系创建和多表操作】# 将所有书的名称后面加上爆款两个字from django.db.models.functions import Concatfrom django.db.models import F, Valuemodels.Book.objects.update(name=Concat(F('name'),Value('爆款')))
Q查询
使用filter()进行条件过滤时,采用的是逻辑与and的操作,如果想要将多个筛选条件更改为or或者not的关系则需要借助Q查询 。在Q查询中|表示or的关系,~表示not的关系 。
import django.db.models import Q# 查询卖出数量大于100或者价格小于20的书籍res = models.Book.objects.filter(~Q(sell_num__gt=100) | Q(price__lt=20))
另外Q查询还有另一个比较高级的用法,就是可以将查询条件的左边也变成字符串的形式 。
# 先产生一个Q的实例q = Q()# 修改q的连接条件的关系q.connector = 'or'q.children.append(('sell_num__gt',100))q.children.append(('price__lt',200))res = models.Book.objects.filter(q)# filter的条件是Q实例化产生的对象,每个条件默认还是and关系,可以修改print(res)
django开启事务
MySQL为了保证数据的安全有一个事务的机制,django既然能够连接MySQL那么django就可以支持MySQL的事务机制 。下述代码就是在django中开启事务:
from django.db import transactiontry:with transaction.atomic():# 在with代码快内书写的所有orm操作都属于同一个事务...except Exception as e:print(r)...
到此这篇关于Django模型层实现多表关系创建和多表操作的文章就介绍到这了,更多相关Django 多表操作内容请搜索趣讯吧以前的文章或继续浏览下面的相关文章希望大家以后多多支持趣讯吧!