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) 

猜你喜欢

转载自www.cnblogs.com/wangkaiok/p/10493608.html
今日推荐