zoukankan      html  css  js  c++  java
  • Django ORM 常用字段和参数

    Django ORM 常用字段和参数

    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指定的文件夹下 然后该字段存文件的路径
    

    AutoField

    AutoField(primary_key=True)  主键字段
    
    int自增列,必须填入参数 primary_key=True。当model中如果没有自增列,则自动会创建一个列名为id的列。
    

    CharField

    CharField(max_length=32)     varchar(32)
    
    字符类型,必须提供max_length参数, max_length表示字符长度。
    

    这里需要知道的是Django中的CharField对应的MySQL数据库中的varchar类型,没有设置对应char类型的字段,但是Django允许我们自定义新的字段,下面我来自定义对应于数据库的char类型

    img

    自定义字段在实际项目应用中可能会经常用到,这里需要对他留个印象

    from django.db import models
    
    # Create your models here.
    #Django中没有对应的char类型字段,但是我们可以自己创建
    class FixCharField(models.Field):
        '''
        自定义的char类型的字段类
        '''
        def __init__(self,max_length,*args,**kwargs):
            self.max_length=max_length
            super().__init__(max_length=max_length,*args,**kwargs)
    
        def db_type(self, connection):
            '''
            限定生成的数据库表字段类型char,长度为max_length指定的值
            :param connection:
            :return:
            '''
            return 'char(%s)'%self.max_length
    #应用上面自定义的char类型
    class Class(models.Model):
        id=models.AutoField(primary_key=True)
        title=models.CharField(max_length=32)
        class_name=FixCharField(max_length=16)
        gender_choice=((1,'男'),(2,'女'),(3,'保密'))
        gender=models.SmallIntegerField(choices=gender_choice,default=3)
    

    IntegerField

    IntegerField()               int
    
    一个整数类型,范围在 -2147483648 to 2147483647。(一般不用它来存手机号(位数也不够),直接用字符串存,)
    

    BigIntergerField

    BigIntergerField()           bigint
    
    长整型(有符号的) -9223372036854775808 ~ 9223372036854775807
    

    DecimalField

    DecimalField()               decimal
    
    - 10进制小数
    - 参数:
    max_digits,小数总长度
    decimal_places,小数位长度
    

    EmailField

    EmailField()                 varchart(254)
    
    字符串类型,Django Admin以及ModelForm中提供验证机制
    

    DateField

    DateField()					 date
    
    日期格式      YYYY-MM-DD
    

    DateTimeField

    DateTimeField()              datetime
    
    auto_now:每次编辑数据的时候都会自动更新该字段时间
        auto_now_add:创建数据的时候自动更新
            
    日期时间字段,格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ],相当于Python中的datetime.datetime()实例。
    

    BooleanField

    BooleanField(Field)
    
    BooleanField(Field)
    给该字段传布尔值 会对应成  数字0/1
        is_delete
        is_status
        is_vip
    

    TextField

    TextField(Field)
    
    - 文本类型
    存储大段文本
    

    FileField

    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
    
            class Movie(models.Model):
                textField = RealCharField(max_length=64)
    
    

    img

    效果:

    字段内的关键字参性参数

    null
    default
    
    django 1.x默认就是级联更新级联删除  django2.x需要你自己手动指定
    	on_delete = models.CASCADE
    	db_contraints = True
    # 百度
    
    

    null

    用于表示某个字段可以为空。
    
    

    unique

    如果设置为unique=True 则该字段在此表中必须是唯一的 。
    
    

    db_index

    如果db_index=True 则代表着为此字段设置索引。
    
    

    default

    为该字段设置默认值。
    
    

    DateField和DateTimeField

    auto_now_add

    配置auto_now_add=True,创建数据记录的时候会把当前时间添加到数据库。
    
    

    auto_now

    配置上auto_now=True,每次更新数据记录的时候会更新该字段。
    
    

    关系字段

    ForeignKey

    外键类型在ORM中用来表示外键关联关系,一般把ForeignKey字段设置在 '一对多'中'多'的一方。
    
    ForeignKey可以和其他表做关联关系同时也可以和自身做关联关系。
    
    

    字段参数

    to

    设置要关联的表
    
    

    to_field

    设置要关联的表的字段
    
    

    on_delete

    当删除关联表中的数据时,当前表与其关联的行的行为。
    
    

    models.CASCADE

    删除关联数据,与之关联也删除
    
    

    db_constraint

    是否在数据库中创建外键约束,默认为True。
    
    

    代码演示:

    def func():
        return 10
    
    class MyModel(models.Model):
        user = models.ForeignKey(
            to="User",
            to_field="id",
            on_delete=models.SET(func)
        )
    
    

    OneToOneField

    to

    设置要关联的表。
    
    

    to_field

    设置要关联的字段。
    
    

    on_delete

    当删除关联表中的数据时,当前表与其关联的行的行为。(参考上面的例子)
    
    

    choices参数

    用户表举例:

    用户的性别
    学历
    婚否
    在职状态
    客户来源
    当你的数据能够被你列举完全  你就可以考虑使用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)
    
    

    两个列子一样的用法:如下

    效果:

    向表中添加数据:

    先存数据
    models.Userinfo.objects.create(username='jason',gender=1)
    models.Userinfo.objects.create(username='tank',gender=2)
    models.Userinfo.objects.create(username='egon',gender=3)
    models.Userinfo.objects.create(username='sean',gender=10)
    
    

    效果:

    获取值:

        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())
    
    
    
        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())
    
    

    效果:

    针对没有(pk=4)数据的值

        # # 针对没有注释信息的数据  get_xxx_display()获取到的还是数字本身
        user_obj = models.Userinfo.objects.get(pk=4)
        print(user_obj.gender)
        print(user_obj.get_gender_display())
    
    

    效果:

    数据库查询优化(面试会问)

    only与defer
    
    
    selected_related与prefetch_related
    
    

    惰性查询:

    django orm查询都是惰性查询
    res = models.Book.objects.all()  # django orm查询都是惰性查询
    #没有用到res变量名 ,就是惰性查询。
    反之:
    print(res)
    
    

    效果:

    反之:

    only与defer的用法:

    noly的使用:

    res = models.Book.objects.only('title')  # 這些對象内部只有title屬性
    # print(res)
    for r in res:
        # print(r.title)
        print(r.price)
    
    
    # res = models.Book.objects.only('title')  # 這些對象内部只有title屬性    存有惰性查询的意思。
    # print(res)
    
    

    效果:

    效果:print(r.title)

    1578564341184

    效果:print(r.price) 走数据库

    only作用

    only作用
    括号内传字段 得到的结果是一个列表套数据对象 该对象内只含有括号内指定的字段属性
    
    对象点该字段属性是不会走数据库的 但是你一旦点了非括号内的字段 也能够拿到数据,但是是重新走的数据库查询吧
    
    

    defer的使用:

    res = models.Book.objects.defer('title')  # defer与only互为反关系
    print(res)
    
    

    效果:

    res = models.Book.objects.defer('title')  # defer与only互为反关系  r点其他数据就不走数据库,就是说除了title数据外其他数据都有,如点title,就会重新走一遍数据库
    for r in res:
        print(r.title)
    
    

    效果:r点其他数据,就是说除了title数据外其他数据都有,如点title,就会重新走一遍数据库

    defer作用:

    defer与only相反
    括号内传字段 得到的结果是一个列表套数据对象 该对象内没有括号内指定的字段属性
    对象点该字段属性会重复走数据库 但是你一旦点了非括号内的字段 就不走数据库了
    
    

    selected_related与prefetch_related的用法

    引子:

        # res = models.Book.objects.get(pk=1)
        # print(res.publish.name)
    
    

    效果:

    selected_related:

    res = models.Book.objects.select_related('publish')
    print(res)
    
    

    效果:

    # res = models.Book.objects.select_related('authors')
    # for r in res:
    #     print(r.publish.name)
    #     print(r.publish.addr)
    
    

    效果:存放多对多字段报错

    1578566391087

    效果:不放多对多字段:

    selected_related作用

        内部是连表操作 现将关系表全部链接起来 之后再一次性查询出来 封装到对象中
        数据对象之后在获取任意表中的数据的时候都不需要再走数据库了 因为全部封装成了对象的属性
        
        select_related括号内只能传外键字段 并且不能是多对多字段 只能是一对多和一对一
        select_related(外键字段1__外键字段2__外键字段3...)
    
    
    prefetch_related的使用:
    res = models.Book.objects.prefetch_related('publish')
    print(res)
    
    

    效果:

    for循环:

       res = models.Book.objects.prefetch_related('publish')
       for r in res:
       print(r.publish.name)
    
    

    效果:

    prefetch_related的作用

    prefetch_related内部是子查询 但是给你的感觉是连表操作
    内部通过子查询将外键管理表中的数据页全部给你封装到对象中
    之后对象点当前表或者外键关联表中的字段也都不需要走数据库了
    
    

    selected_related与prefetch_related的优缺点:

    优点:select_related连表操作 好处在于只走一次sql查询
    缺点:耗时耗在 连接表的操作  10s
    
    :prefetch_related子查询  走两次sql查询
    耗时耗在 查询次数      1s
    
    

    django orm如何开启事务操作

    事务的四大特性(ACID)

    原子性:

    原子性(Atomicity),原子意为最小的粒子,即不能再分的事务,要么全部执行,要么全部取消(就像上面的银行例子)
    
    

    一致性:

    一致性(Consistency):指事务发生前和发生后,数据的总额依然匹配
    
    

    隔离性:

    隔离性(Isolation):简单点说,某个事务的操作对其他事务不可见的
    
    

    持久性:

     持久性(Durability):当事务完成后,其影响应该保留下来,不能撤消,只能通过“补偿性事务”来抵消之前的错误
        			start transaction
    				rollback
    				commit
    
    

    数据库的三大设计范式

    第一范式:当关系模式R的所有属性都不能在分解为更基本的数据单位时,称R是满足第一范式的,简记为1NF。满足第一范式是关系模式规范化的最低要
    
    求,否则,将有很多基本操作在这样的关系模式中实现不了。
    
    第二范式:如果关系模式R满足第一范式,并且R得所有非主属性都完全依赖于R的每一个候选关键属性,称R满足第二范式,简记为2NF。
    
    第三范式:设R是一个满足第一范式条件的关系模式,X是R的任意属性集,如果X非传递依赖于R的任意一个候选关键字,称R满足第三范式,简记为3NF.
    
    注:关系实质上是一张二维表,其中每一行是一个元组,每一列是一个属性
    
    

    django orm开启事务操作

    导入模块:

    from django.db import transaction
    
    
    # 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:contronnar  控制器(路由分发 urls.py)
    
    

    本质

    本质:MTV本质也是MVC
    
    

    BMS:

    Web领域没有绝对的安全 也没有绝对的不安全
    
    
  • 相关阅读:
    DataSet生成gb2312编码的xml
    利用SendMessage实现C#进程间通信
    DataSet与Xml之间的转换
    xml解析
    当前时间加指定的几个月
    Excel利用poi导入导出(上)
    mybatis.generator.plugins生成基础类
    Excel利用poi导入导出(下)
    ASP.NET 中的Session统一管理
    太幸福了,没有比我们更开放的网络了!
  • 原文地址:https://www.cnblogs.com/WQ577098649/p/12173803.html
Copyright © 2011-2022 走看看