F和Q事务
Posted wangkaiok
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了F和Q事务相关的知识,希望对你有一定的参考价值。
现在增加了书的销量sale字段和stock库存字段。
已知
from django.db import models # Create your models here. class Person(models.Model): nid = models.AutoField(primary_key=True) name = models.CharField(verbose_name=‘姓名‘,max_length=32,null=True,blank=True,db_column=‘username‘) age = models.IntegerField(editable=False) #int类型 birth = models.DateTimeField(auto_now=True) gender = models.BooleanField(choices=((0, ‘男‘), (1, ‘女‘))) class Meta: db_table = "person" verbose_name=‘个人信息‘ verbose_name_plural=‘所有用户信息‘ def __str__(self): return ‘<Person: {} - {} - {}>‘.format(self.pk, self.name, self.age) class Publisher(models.Model): name = models.CharField(max_length=32) def __str__(self): return ‘<Publisher: {} - {}>‘.format(self.pk, self.name) class Book(models.Model): title = models.CharField(max_length=32) price = models.DecimalField(max_digits=5,decimal_places=2) #最大999.99 sale = models.IntegerField() stock = models.IntegerField() publisher = models.ForeignKey(‘Publisher‘,related_name=‘books‘,related_query_name=‘book‘,on_delete=models.CASCADE) def __str__(self): return ‘<Book: {} - {}>‘.format(self.pk, self.title) class Author(models.Model): name = models.CharField(max_length=32) books = models.ManyToManyField(‘Book‘) #多对多创建,后面是要关联的表Book类
Django终端打印SQL语句
在Django项目的settings.py文件中,在最后复制粘贴如下代码:
LOGGING = { ‘version‘: 1, ‘disable_existing_loggers‘: False, ‘handlers‘: { ‘console‘:{ ‘level‘:‘DEBUG‘, ‘class‘:‘logging.StreamHandler‘, }, }, ‘loggers‘: { ‘django.db.backends‘: { ‘handlers‘: [‘console‘], ‘propagate‘: True, ‘level‘:‘DEBUG‘, }, } }
即为你的Django项目配置上一个名为django.db.backends的logger实例即可查看翻译后的SQL语句。
import os if __name__ == ‘__main__‘: os.environ.setdefault("DJANGO_SETTINGS_MODULE", "about_orm.settings") import django django.setup() from app01 import models from django.db.models import F,Q #F # F吧字段的值取出来,作对比 # ret = models.Book.objects.filter(sale__gt=F(‘stock‘)) # print(ret) # F吧字段的值取出来,作+-*/ #让销量翻倍 #update效率高 # models.Book.objects.update(sale=F(‘stock‘)*2) #UPDATE "app01_book" SET "sale" = ("app01_book"."stock" * 2); args=(2,) # obj = models.Book.objects.get(pk=1) # obj.sale = 100 # obj.save() #save是把所有的值都更新的。update效率高,update只更改一个字段。 #Q ret = models.Book.objects.filter(pk__gt=1,pk__lt=5) ret = models.Book.objects.filter(Q(pk__gte=4) | Q(pk__lte=2)) #| 或 ret = models.Book.objects.filter(Q(pk__gte=4) & Q(pk__lte=2)) #& 和 ret = models.Book.objects.filter(Q(Q(pk__gte=4) & Q(pk__lte=2))) #包含 ret = models.Book.objects.filter(~Q(Q(pk__gte=4) & Q(pk__lte=2))) #~ 非 # ~ 非 | 或 & 与 print(ret)
以上是关于F和Q事务的主要内容,如果未能解决你的问题,请参考以下文章
Django中的聚合/分组查询/F/Q查询/orm执行原生sql语句/ ORM事务和锁
python 之 Django框架(orm单表查询orm多表查询聚合查询分组查询F查询 Q查询事务Django ORM执行原生SQL)