zoukankan      html  css  js  c++  java
  • CSIC_716_2020109【Django入门---models中的常用字段、字段内的关键字参数、数据库优化查询、开启事务】

    常用字段

    AutoField(primary_key=True)  主键字段
    
    CharField(max_length=32)     varchar(32)
    
    IntegerField()               int
    
    BigIntergerField()           bigint
    
    DecimalField()               decimal
    
    EmailField()                 varchart(254)
    
    DateField()					 date
    
    DateTimeField()              datetime
    	auto_now:每次编辑数据的时候都会自动更新该字段时间
    	auto_now_add:创建数据的时候自动更新 
    BooleanField(Field)
    
    	给该字段传布尔值 会对应成  数字0/1
    	is_delete
    	is_status
    	is_vip
    
    TextField(Field)
        - 文本类型
    	存储大段文本
    
    FileField(Field)
        - 字符串,路径保存在数据库,文件上传到指定目录,只存文件路径
    	upload_to = '指定文件路径'
    	给该字段传文件对象 文件会自动保存到upload_to指定的文件夹下 然后该字段存文件的路径
    

      

    如何自定义char类型字段

    from django.db.models import Field
    
    
    class RealCharField(Field):
        def __init__(self, max_length, *args, **kwargs):
            self.max_length = max_length  # 拦截一个父类的方法 操作完之后 利用super调用父类的方法
            super().__init__(max_length=max_length, *args, **kwargs)
    
        def db_type(self, connection):
            return 'char(%s)' % self.max_length
    

      

    choices参数

    类似于枚举:
    先定义一个大元组gender_choice代表可以选择的范围,大元组里套若干个小元组,小元组里放两个元素,第一个是存数据库的值,第二个是展示到前端的值。
    定义字段(gender)的时候,里面用字段choices代表可以选择的值,

    如gender = models.CharField(max_length = 32, choices = gender_choice)。

    取值的时候    对象.get_xxx_display()   如:user_obj.get_gender_display() 

    choices参数
    用户的性别
    学历
    婚否
    在职状态
    客户来源
    当你的数据能够被你列举完全
    你就可以考虑使用choices参数
    
    
    class Userinfo(models.Model):
        username = models.CharField(max_length=32)
        gender_choices = (
            (1, '男'),
            (2, '女'),
            (3, '其他'),
        )
        gender = models.IntegerField(choices=gender_choices)
        # 该字段还是存数字 并且可以匹配关系之外的数字
        record_choices = (('checked', "已签到"),
                          ('vacate', "请假"),
                          ('late', "迟到"),
                          ('noshow', "缺勤"),
                          ('leave_early', "早退"),
                          )
    
        record = models.CharField("上课纪录", choices=record_choices, default="checked", max_length=64)
    
    
    user_obj = models.Userinfo.objects.get(pk=1)
    print(user_obj.username)
    print(user_obj.gender)
    # 针对choices参数字段 取值的时候   get_xxx_display()
    print(user_obj.get_gender_display())
    # 针对没有注释信息的数据  get_xxx_display()获取到的还是数字本身
    user_obj = models.Userinfo.objects.get(pk=4)
    print(user_obj.gender)
    print(user_obj.get_gender_display())
    

      

    数据库优化查询

    defer延期,括号内的延期取

    only只有,只取括号内的

    select_related与prefetch_related

    select_related(连表操作)

    select_related   会进行连表操作,连接所有有关系的表,并只查询一次。得到相关表的所有字段信息封装到结果对象中。以后需要查属性只需要通过句点符就行,不再进行数据库查询。

    select_related()的括号内只能传外键字段,并且不能是多对多的外键

    select_related(外键1__外键2__外键3),通过外键可以无限连表。

    prefetch_related(子查询)   prefetch数据预取

    内部通过子查询的方式(因为数据库语句会执行两(多)次,将第一条的结果作为第二条语句的条件),将外键相关的表和本表中所有的字段存到结果对象中,取值也只需要通过句点符取值。

    多对对的外键只能通过这种方式

    https://www.cnblogs.com/tuifeideyouran/p/4232028.html

    django orm开启事务操作

    事务的四大特性 acid

    原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)

    数据库中开启事务

    try: 
        sql语句代码块
    except 异常: 
        rollback; 
    else:  
        commit;
    

      

    数据库的三大范式设计:

    第一范式(NF1):每个字段要有原子性,不可再分割
    
    第二范式(NF2):每个字段与主键要有相关性。
    
    第三范式(NF3):每个字段与主键要直接相关,而不是间接相关
    

     

    django orm中开启事务操作

    from django.db import transaction
    with transaction.atomic():
        # 在with代码块中执行的orm语句同属于一个事务
        pass
    

     事务相关的其他配置 有待补充

    MTV与MVC模型

    MTV

    django号称是MTV框架
    M:models
    T:templates
    V:views

    MVC

    M:models
    V:views
    C:controller 控制器(路由分发 urls.py)
    本质:MTV本质也是MVC

    ding

  • 相关阅读:
    BestCoder6 1002 Goffi and Squary Partition(hdu 4982) 解题报告
    codeforces 31C Schedule 解题报告
    codeforces 462C Appleman and Toastman 解题报告
    codeforces 460C. Present 解题报告
    BestCoder3 1002 BestCoder Sequence(hdu 4908) 解题报告
    BestCoder3 1001 Task schedule(hdu 4907) 解题报告
    poj 1195 Mobile phones 解题报告
    二维树状数组 探索进行中
    codeforces 460B Little Dima and Equation 解题报告
    通过Sql语句控制SQLite数据库增删改查
  • 原文地址:https://www.cnblogs.com/csic716/p/12174229.html
Copyright © 2011-2022 走看看