• F查询,Q查询,事物,only与defer


    F查询

    之前的单表查询多表查询筛选条件都是一个固定的值,那么如何用字段来筛选呢?

    比如 :  
            查询卖出数大于库存数的商品

    这个时候我们就可以用到django里面的F查询了

    查询示例表

    ·在test.py测试要记得先做好配置

    import os
    
    
    if __name__ == "__main__":
        os.environ.setdefault("DJANGO_SETTINGS_MODULE", "day59.settings")
        import django
        django.setup()  

        先导入模块
        from django.db.models import F,Q

        查询卖出数大于库存数的商品
        res = models.Product.objects.filter(maichu__gt=F('kucun'))
        print(res)


        将所有的商品的价格提高100块
        models.Product.objects.update(price=F('price')+100)


        将所有商品的名字后面都加一个五折大甩卖

     这里需要用到字符串的拼接,Concat模块和Value模块

       导入模块:
        from django.db.models.functions import Concat
        from django.db.models import Value
        models.Product.objects.update(name=Concat(F('name'),Value('五折大甩卖')))

     

    Q查询

    之前查询的时候filter里面写多个过滤条件的话,默认是and逻辑,q查询可以让它实现or逻辑

        res = models.Product.objects.filter(price=188.88,name='连衣裙五折大甩卖')
        #这个是and逻辑
        from django.db.models import Q

        中间用逗号隔开默认是and逻辑
        res = models.Product.objects.filter(Q(price=188.88),Q(name='连衣裙五折大甩卖')) 

        变成or逻辑要中间加 |
        res = models.Product.objects.filter(Q(price=188.88)|Q(name='连衣裙五折大甩卖')) 

        取反~
        res = models.Product.objects.filter(Q(price=188.88)|~Q(name='连衣裙五折大甩卖'))  # not
        混合使用  需要注意的是Q对象必须放在普通的过滤条件前面
        res = models.Product.objects.filter(~Q(name='连衣裙五折大甩卖'),price=188.88)  # not
     

    改变Q对象的默认关系 

       from django.db.models import F, Q
        q = Q()
        q.connector = 'or'  # 通过这个参数可以将Q对象默认的and关系变成or
        q.children.append(('price',188.88))
        q.children.append(('name','高跟鞋五折大甩卖'))
        res = models.Product.objects.filter(q)  # Q对象查询默认也是and
        print(res)

    事物

    我们在卖出一件商品的时候,库存就必须减少一件,怎么实现呢?用事物

    简单回顾一下mysql事物,四大特性:原子性,一致性,隔离性,持久性

    一定需要记住的是原子性,事物的原子性就是:

    多个sql语句操作要么同时成功,要么都失败。(要么都失败是因为只要有一个失败就会回滚到原来的状态)

    from django.db import transaction
        from django.db.models import F
        with transaction.atomic():
            # 在with代码块儿写你的事务操作
            models.Product.objects.filter(id=1).update(kucun=F('kucun')-1)
            models.Product.objects.filter(id=1).update(maichu=F('maichu')+1)
    
        # 写其他代码逻辑
        print('hahah')

    自定义char字段

    class MyCharField(models.Field):#自定义char字段
        def __init__(self,max_length,*args,**kwargs):
            self.max_length = max_length
            super().__init__(max_length=max_length,*args,**kwargs)
    
        def db_type(self, connection):
            return 'char(%s)'%self.max_length
    
    class Product(models.Model):
        name = models.CharField(max_length=32)
        price = models.DecimalField(max_digits=8,decimal_places=2)
        maichu = models.IntegerField()
        kucun = models.IntegerField()
        info = MyCharField(max_length=32,null=True)#char字段使用

     only 与 defer


        only与defer  拿到的是一个对象  两者是相反的
        res = models.Product.objects.values('name')
        res = models.Product.objects.only('name')#直接返回name的值
        res = models.Product.objects.defer('name')#返回的是除name的其它值
        for i in res:
            print(i.name)

        res = models.Product.objects.filter(id=1).first()
        print(res.gender)
        print(res.get_gender_display())  # 获取编号对应的中文注释
        models.Product.objects.create(...gender=1)

    update()与save()的区别

    两者都是对数据的修改保存操作,但是save()函数是将数据列的全部数据项全部重新写一遍,而update()则是针对修改的项进行针对的更新效率高耗时少(以后对数据的修改保存用update())

     

    choices

    建字段

    使用

  • 相关阅读:
    matlab cell
    matlab linux 快捷键设置——有问题还是要解决
    latex 小结
    TOJ 1258 Very Simple Counting
    TOJ 2888 Pearls
    HDU 1248 寒冰王座
    TOJ 3486 Divisibility
    TOJ 3635 过山车
    TOJ 1840 Jack Straws
    HDU 4460 Friend Chains
  • 原文地址:https://www.cnblogs.com/tuanzibuku/p/11019899.html
Copyright © 2020-2023  润新知