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)

如果在动画正在进行时单击,Android Fragment 事务动画会崩溃

片段事务中的实例化错误

BottomNavigationView 滞后于片段事务

Django ORM 之FQ查询与事务