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字段對應的註釋
相關文章
相關標籤/搜索