Django之F、Q查询,事务,自定义char字段

    F查询
        from django.db.models import F,Q
        # 当查询条件来自于数据库的某个字段,这个时候就必须使用F
        # 查询卖出数大于库存数的商品
        res = models.Product.objects.filter(maichu__gt=F('kucun'))
        # 将所有商品的价格提高100块
        models.Product.objects.update(price=F('price')+100)
        # 将所有商品的名字后面加一个爆款后缀
        from django.db.models.functions import Concat
        from django.db.models import Value
        
        models.Product.objects.update(name=F('name')+'爆款')  # 错误示范
        models.Product.objects.update(name=Concat(F('name'),Value('爆款')))
    Q查询 
        # 当你的查询条件想以或的关系查询数据
        models.Product.objects.filter(Q(name='变形金刚'),Q(price=999.99))  # 这样写默认还是and关系
        models.Product.objects.filter(Q(name='变形金刚')|Q(price=999.99)) 
        # Q与普通过滤条件混合使用
        models.Product.objects.filter(Q(name='变形金刚'),price=100.00)
        
        
        Q查询进阶操作(******# 先实例化一个Q对象
        q = Q()
        q.connector = 'or'
        q.children.append(('name','jason'))
        q.children.append(('price',666))
        # q对象支持直接放在filter括号内
        models.User.objects.filter(q)  # q对象默认也是and关系
    
    事务
        from django.db import transaction
        with transaction.atomic():
            # 这里写多个数据库操作
        print('其他逻辑代码')
    
    自定义字段类型
        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):
                return 'char(%s)'%self.max_length
        
        class User(models.Model):
            name = models.CharField(max_length=32)
            password = MyCharField(max_length=32)
    
    only与defer
        # 两者是相反的
        res = models.User.objects.only('name')
        
    
    choices字段
        class User(models.Model):
            name = models.CharField(max_length=32)
            password = MyCharField(max_length=32)
            choices = ((1,'重点大学'),(2,'普通本科'),(3,'专科'),(4,'其他'))
            education = models.IntegerField(choices=choices)
            
        user_obj.education  # 拿到的是数字
        user_obj.get_education_display()  # 固定用法 获取choice字段对应的注释

 

posted @ 2019-06-17 23:39  希希大队长  阅读(407)  评论(0编辑  收藏  举报