• Django--数据库查询操作


    F查询和Q查询:

      F查询:

        Django中提供f()来进行两个值之间的比较,F()可以在查询中引用字段来,来比较同一个model实例中的两个不同的字段

        示例1:查询卖出数量大于库存数量的商品

    from django.db.models import F
    ret1=models.Product.objects.filter(maichu__gt=F('kucun'))
    print(ret1)

        F可以用来帮我们取到表中某个字段对应的值来当作我们的筛选条件,而不是我认为自定义的常量了,实现了动态比较的效果

        Django支持F对象和F对象之间的加减乘除的取模的操作。基于此可以子啊表中的数值类型进行数学运算

        将每个商品的价格提高50块

    models.Product.objects.update(price=F('price')+50)

        如果修改char字段,在后面加上新的字符,这个时候是需要使用Concat操作,并且要和凭借值Value一起使用。

      

      Q查询:

        filter()等方法中使用逗号隔开的条件的与的关系。如果这时候你需要执行更复杂的查询(or...),那么就可以使用Q对象了

        示例1:查询卖出数量大于100或者价格少于100块的商品:

    from django.db.models import Q
    models.Product.objects.filter(Q(maichu__gt=100)|Q(price__lt=100))

        对条件包裹一层Q的时候,filter就可以支持交叉与或并的比较符

        示例二:查询库存数是100并且卖出数量不是0的产品

    models.Product.objects.filter(Q(kucun=100)&~Q(maichu=0))

        我们可以组合使用&和|操作符以及使用括号进行分组来编写任意复杂的Q对象,同时Q对象可以使用~操作符进行取反, 这允许组合正常的查询和取反(NOT)查询

        示例三:查询产品名包含新款,并且库存数大于60的

    models.Product.objects.filter(Q(kucun__gt=60), name__contains="新款")

        查询函数可以混合使用Q对象和关键字参数。所有提供给查询函数的参数(关键字参数或Q对象)都将
    “AND”在一起。但是如果出现Q对象,它必须位于所有关键字参数的前面

        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)
        print(res)

    事务操作:

      事务的ACID:  

        原子性、一致性、隔离性、持久性

      定义:将多个sql语句操作变成原子性操作,要么同时成功,有一个失败则在里面回滚都原来的状态,保证数据的完整性和一致性(NoSQL数据库对于事务则是部分支持)

    from django.db import transaction
        with transaction.atomic():
            # 在with代码块中写事务操作
            models.Product.objects.filter(id=1).update(F('kucun') - 1, F('maichu') + 1)

    自定义orm的字段:

    class MyCharField(models.Field):
        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):
        info = MyCharField(max_lengh=32)

      

    only和defer:拿到的是一个对象,两者之间是相反的

    res = models.Product.object.defer("name")
    for i in res:
        print(i.name)
    
    res = models.Product.object.only("name")
    for i in res:
        print(i.name)

    Django中的常用的字段和参数:(https://www.cnblogs.com/Dominic-Ji/p/9203990.html

      1、常用字段

        AutoField:

          int自增列,必须填入参数primary_key=True。当model中如果没有自增列,则自动会创建一个列名为id的列

        IntegerField:

          一个整数类型,范围在 -2147483648 to 2147483647。(一般不用它来存手机号(位数也不够),直接用字符串存,)

        CharField:

          字符类型,必须提供max_length参数, max_length表示字符长度。

      Django中的CharField对应的MySQL数据库中的varchar类型,没有设置对应char类型的字段,但是Django允许我们定义新的字段,在上面已经定义了。

    Django中的几个比较重要的方法:(https://www.cnblogs.com/Dominic-Ji/p/9213887.html

      update和save之间的区别:

        两者都是对数据的修改和保存的操作,但是save函数是将数据列的全部数据项全部重新写了一遍,而update则是针对修改项进行针对的跟新,效率高而且耗时更少。所以以后要是有对数据的修改更推荐使用uodate()

      choices:

    choices = ((1, ''), (2,''),(3,'其他'))
    
    gender = models.IntegerField(choices=choices, default=2)
    
    
    res = models.Product.objects.filter(id=1).first()
    print(res.get_gender_display())  # 可以直接查到指定数据中的性别关键字

      

  • 相关阅读:
    网页中15秒后重新发送验证码,多少秒后发送验证码
    javascript 数组去重 unique
    微信支付和微信支付通知基于sdk的说明
    php对象序列化和cookie的问题,反序列化false
    php对象序列化总出错false
    图片懒加载lazyload.js详解
    手机联动地址选择框,移动端地址联动
    Java类加载原理解析(转)
    location对象介绍
    SpringMVC使用fastjson自定义Converter支持返回jsonp格式(转)
  • 原文地址:https://www.cnblogs.com/tulintao/p/11431810.html
Copyright © 2020-2023  润新知