zoukankan      html  css  js  c++  java
  • web框架Django(form,model)

    第23章


    一、一大波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钩子
        
        
    二、Form操作
        1. 数据验证(强大)
            - 每一个字段(正则,字段钩子)
            - clean
            - _post_clean
            
            对于错误信息:__all__
            
            
    四、序列化操作
        
        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)

    A wise man thinks all that he says, a fool says all that he thinks.
  • 相关阅读:
    SpringMVC整合redis(Spring Data Redis)
    maven——pom.xml
    腾讯云Nginx配置HTTPS
    LNMP运行环境搭建
    Mac——homebrew安装PHP环境
    Yii2之路——安装配置
    Linux之路——FFmpeg安装
    PHP之路——geohash查找附近的人
    PHPStorm对laravel代码自动提示
    shell命令总结
  • 原文地址:https://www.cnblogs.com/BernieChen/p/6322024.html
Copyright © 2011-2022 走看看