冰凍三尺非一日之寒--web框架Django(form,model)

第23章數據庫

 


1、一大波model操做
    
    1. 建立數據庫表
        # 單表
        # app01_user ==> tb1
        # users
        class User(models.Model):
            name = models.CharField(max_length=32)
            pwd = models.CharField(max_length=32)
            
            class Meta:
                # 數據庫中生成的表名稱 默認 app名稱 + 下劃線 + 類名
                db_table = "tb1"

                index_together = [
                    ("name", 'pwd'),
                ]
                # 最左前綴的模式:
                # select * from where name='xx'
                # select * from where name='xx' and email = 'xx'
                # select * from where email = 'xx' # 沒法命中索引
                
                unique_together = (("driver", "restaurant"),)
                
                verbose_name = 「上課記錄」
                verbose_name_plural=「「上課記錄」」
        
        # 一對多/一對一/多對多
        
        一對多:
                def func():
                        
                    return 5
                
                
                class UserType(models.Model):
                    name = models.CharField(max_length=32)
                    
                
                class User(models.Model):
                    name = models.CharField(max_length=32)
                    pwd = models.CharField(max_length=32)
                    ....         ForiegnKey(to="UserType",to_field='id',on_delete=models.SET(func))
                
                # delete from user where id=1
                # delete from UserType where id=1 # 報錯
                
                # UserType.objects.filter(id=1).delete()
            
            
                
                # 正向
                # v = User.objects.all()
                # for item in v:
                #     item.user
                #     item.pwd
                #     item.ut.name

                # User.objects.all().values('user','ut__name')

                # 反向
                # v = UserType.objects.all()
                # for item in v:
                #     item.name
                #     item.id
                #     item.user_set.all() # item.b.all()


                # models.UserType.objects.all().values('name','user__pwd')
                
        多對多:
            a. django建立第三張表
                m2m.remove
                m2m.add
                m2m.set
                m2m.clear
                m2m.filter()
            b. 自定義第三張表(無m2m字段)
                
                本身鏈表查詢
                
            c. 自定義第三張表(有m2m字段)
                # 經過m2m字段查操做
                # 經過m2m字段 clear
        
        
        
        
    2. 操做數據庫表
        - 基本操做
        - QuerySet中的方法:
            - 返回QuerySet類型(select_related,prefetch_related)
                
                select_related
                
                    users = models.User.objects.all().select_related('ut')
                    for row in users:
                        print(row.user,row.pwd,row.ut_id)
                        print(row.ut.name)
                        print(row.tu.name) # 再發起一次SQL請求
                
                prefetch_related
                    
                    users = models.User.objects.filter(id__gt=30).prefetch_related('ut','tu')
                    # select * from users where id > 30
                    # 獲取上一步驟中全部的ut_id=[1,2]
                    # select * from user_type where id in [1,2]
                    # select * from user_type where id in [1,2]
                    
                    for row in users:
                        print(row.user,row.pwd,row.ut_id)
                        print(row.ut.name)
                    
    3. 數據驗證(弱)
        
        full_clean進行驗證
            - 每一個字段的正則
            - clean鉤子
    
    
2、Form操做
    1. 數據驗證(強大)
        - 每個字段(正則,字段鉤子)
        - clean
        - _post_clean
        
        對於錯誤信息:__all__
        
        
4、序列化操做
    
    ErrorDict
        - 自定義encoder
        
    QuerySet
            第一種:
                from django.core import serializers
                
                v = models.tb.objects.all()
                data = serializers.serialize("json", v)
                
            第二種:
                
                import json
                from datetime import date
                from datetime import datetime
                   
                class JsonCustomEncoder(json.JSONEncoder):
                    
                    def default(self, field):
                    
                        if isinstance(field, datetime):
                            return field.strftime('%Y-%m-%d %H:%M:%S')
                        elif isinstance(field, date):
                            return field.strftime('%Y-%m-%d')
                        else:
                            return json.JSONEncoder.default(self, field)
   
                v = models.tb.objects.values('id','name','ctime')
                v = list(v)
                v = json.dumps(v,cls=JsonCustomEncoder)django

相關文章
相關標籤/搜索