zoukankan      html  css  js  c++  java
  • Django_ORM_字段属性

    Django_ORM_字段属性

     常用字段

    AutoField
    int自增列,必填参 primary_key=True 默认会自动创建一个列名为id的列 
    
    IntegerField 一个整数类型,范围在 -2147483648 to 2147483647
    CharField 字符类型,必提供max_length参数, max_length表示字符长度
    DateField 日期字段,日期格式 YYYY-MM-DD,相当于Python中的datetime.date()实例
    DateTimeField 日期时间字段,格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ],相当于Python中的datetime.datetime()实例

    字段合集

      1 AutoField(Field)
      2         - int自增列,必须填入参数 primary_key=True
      3 
      4     BigAutoField(AutoField)
      5         - bigint自增列,必须填入参数 primary_key=True
      6 
      7         注:当model中如果没有自增列,则自动会创建一个列名为id的列
      8         from django.db import models
      9 
     10         class UserInfo(models.Model):
     11             # 自动创建一个列名为id的且为自增的整数列
     12             username = models.CharField(max_length=32)
     13 
     14         class Group(models.Model):
     15             # 自定义自增列
     16             nid = models.AutoField(primary_key=True)
     17             name = models.CharField(max_length=32)
     18 
     19     SmallIntegerField(IntegerField):
     20         - 小整数 -32768 ~ 32767
     21 
     22     PositiveSmallIntegerField(PositiveIntegerRelDbTypeMixin, IntegerField)
     23         - 正小整数 0 ~ 32767
     24     IntegerField(Field)
     25         - 整数列(有符号的) -2147483648 ~ 2147483647
     26 
     27     PositiveIntegerField(PositiveIntegerRelDbTypeMixin, IntegerField)
     28         - 正整数 0 ~ 2147483647
     29 
     30     BigIntegerField(IntegerField):
     31         - 长整型(有符号的) -9223372036854775808 ~ 9223372036854775807
     32 
     33     BooleanField(Field)
     34         - 布尔值类型
     35 
     36     NullBooleanField(Field):
     37         - 可以为空的布尔值
     38 
     39     CharField(Field)
     40         - 字符类型
     41         - 必须提供max_length参数, max_length表示字符长度
     42 
     43     TextField(Field)
     44         - 文本类型
     45 
     46     EmailField(CharField):
     47         - 字符串类型,Django Admin以及ModelForm中提供验证机制
     48 
     49     IPAddressField(Field)
     50         - 字符串类型,Django Admin以及ModelForm中提供验证 IPV4 机制
     51 
     52     GenericIPAddressField(Field)
     53         - 字符串类型,Django Admin以及ModelForm中提供验证 Ipv4和Ipv6
     54         - 参数:
     55             protocol,用于指定Ipv4或Ipv6, 'both',"ipv4","ipv6"
     56             unpack_ipv4, 如果指定为True,则输入::ffff:192.0.2.1时候,可解析为192.0.2.1,开启此功能,需要protocol="both"
     57 
     58     URLField(CharField)
     59         - 字符串类型,Django Admin以及ModelForm中提供验证 URL
     60 
     61     SlugField(CharField)
     62         - 字符串类型,Django Admin以及ModelForm中提供验证支持 字母、数字、下划线、连接符(减号)
     63 
     64     CommaSeparatedIntegerField(CharField)
     65         - 字符串类型,格式必须为逗号分割的数字
     66 
     67     UUIDField(Field)
     68         - 字符串类型,Django Admin以及ModelForm中提供对UUID格式的验证
     69 
     70     FilePathField(Field)
     71         - 字符串,Django Admin以及ModelForm中提供读取文件夹下文件的功能
     72         - 参数:
     73                 path,                      文件夹路径
     74                 match=None,                正则匹配
     75                 recursive=False,           递归下面的文件夹
     76                 allow_files=True,          允许文件
     77                 allow_folders=False,       允许文件夹
     78 
     79     FileField(Field)
     80         - 字符串,路径保存在数据库,文件上传到指定目录
     81         - 参数:
     82             upload_to = ""      上传文件的保存路径
     83             storage = None      存储组件,默认django.core.files.storage.FileSystemStorage
     84 
     85     ImageField(FileField)
     86         - 字符串,路径保存在数据库,文件上传到指定目录
     87         - 参数:
     88             upload_to = ""      上传文件的保存路径
     89             storage = None      存储组件,默认django.core.files.storage.FileSystemStorage
     90             width_field=None,   上传图片的高度保存的数据库字段名(字符串)
     91             height_field=None   上传图片的宽度保存的数据库字段名(字符串)
     92 
     93     DateTimeField(DateField)
     94         - 日期+时间格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ]
     95 
     96     DateField(DateTimeCheckMixin, Field)
     97         - 日期格式      YYYY-MM-DD
     98 
     99     TimeField(DateTimeCheckMixin, Field)
    100         - 时间格式      HH:MM[:ss[.uuuuuu]]
    101 
    102     DurationField(Field)
    103         - 长整数,时间间隔,数据库中按照bigint存储,ORM中获取的值为datetime.timedelta类型
    104 
    105     FloatField(Field)
    106         - 浮点型
    107 
    108     DecimalField(Field)
    109         - 10进制小数
    110         - 参数:
    111             max_digits,小数总长度
    112             decimal_places,小数位长度
    113 
    114     BinaryField(Field)
    115         - 二进制类型
    116 
    117 字段合集
    View Code

    字段参数

    null	  用于表示某个字段可以为空 
    unique	  如果设置为unique=True 则该字段在此表中必须是唯一的 
    db_index  如果db_index=True 则代表着为此字段设置数据库索引 
    default	  为该字段设置默认值

    时间字段独有

      DatetimeField、DateField、TimeField这个三个时间字段,都可以设置如下属性

    # auto_now_add	  配置auto_now_add=True,创建数据记录的时候会把当前时间添加到数据库 
        #可用在生日
    
    # auto_now	  配置上auto_now=True,每次更新数据记录的时候会更新该字段 
        #可用在最近修改日期

    关系字段

    ForeignKey

      外键,一对多,多对一

    参数

    to

      设置要关联的表

    to_fied 

      设置要关联的表的字段(不加这个,关联的默认就是 id 字段)

    related_name   

      反向操作使用的字段名,用于代替原反向查询时的  '表名_set' 

    栗子:

    ForeignKey字段中未添加参数 related_name 

    class Classes(models.Model):   
      name = models.CharField(max_length=32) 
    class Student(models.Model):  
      name = models.CharField(max_length=32)
      theclass = models.ForeignKey(to="Classes")

    查询某个班级关联的所有学生(反向查询)时

    models.Classes.objects.first().student_set.all()

    ForeignKey字段中添加了参数 related_name 后

    class Student(models.Model):
      name = models.CharField(max_length=32)
      theclass = models.ForeignKey(to="Classes", related_name="students")

    查询某个班级关联的所有学生(反向查询)时

    models.Classes.objects.first().students.all()

    related_query_name       

      反向查询操作时,双下滑查询的时候可以替换表名

    on_delete                       

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

      默认 1.0版本中会设置为on_delete = models.CASCADE

    取值:

      models.CASCADE          删除关联数据,与之关联也删除
        2.0 版本中不会自动添加这个.需要手动添加此参数
      
      models.DO_NOTHING 删除关联数据,引发错误IntegrityError   models.PROTECT 删除关联数据,引发错误ProtectedError   models.SET_NULL 删除关联数据,与之关联的值设置为null(前提FK字段需要设置为可空)   models.SET_DEFAULT 删除关联数据,与之关联的值设置为默认值(前提FK字段需要设置默认值)   models.SET 删除关联数据,     a. 与之关联的值设置为指定值,设置:models.SET(值)     b. 与之关联的值设置为可执行对象的返回值,设置:models.SET(可执行对象)

    栗子

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

    db_constraint             

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

      设置成 False 后,将取消约束,即软关联, 相当于外键失效

        通常我们都是用代码去限制关联,而不是通过数据库

        数据库设置的外键管理太死了,不灵活,后续维护麻烦

    limit_choices_to = {"field":"filter_val"}  

      在Admin或ModelForm中显示关联数据时,提供的条件

    实例:

    # models.py
    tutor = models.ForeignKey(verbose_name='班主任', to='UserInfo', related_name='classes',limit_choices_to={"depart":1001})

    UserInfo.objects.filter(depart
    =1001])

    OneToOneField 一对一关联

    参数

    to    设置要关联的表
    to_field    设置要关联的字段
    on_delete    同ForeignKey字段

    ManyToManyField 多对多

    参数

    to 设置要关联的表
    
    related_name 同ForeignKey字段
    related_query_name 同ForeignKey字段
    symmetrical 仅用于多对多自关联时,指定内部是否创建反向操作的字段 默认为True
    through 使用ManyToManyField字段,Django将自动生成一张表来管理多对多的关联关系   手动创建第三张表来管理多对多关系,需要通过through来指定第三张表的表名
    through_fields 设置关联的字段
    db_table 默认创建第三张表时,数据库中表的名称

    栗子

    class Person(models.Model):
      name = models.CharField(max_length=16)
      friends = models.ManyToManyField("self")
      # 此时,person对象就没有person_set属性
    
    class Person(models.Model):
      name = models.CharField(max_length=16)
      friends = models.ManyToManyField("self", symmetrical=False)
      # 此时,person对象现在就可以使用person_set属性进行反向查询 

    多对多关联关系的三种方式

    方式一:自行创建第三张表

     1 class Book(models.Model):
     2   title = models.CharField(max_length=32, verbose_name="书名")
     3 class Author(models.Model):
     4   name = models.CharField(max_length=32, verbose_name="作者姓名")
     5 
     6 # 自己创建第三张表,分别通过外键关联书和作者
     7 class Author2Book(models.Model):
     8   author = models.ForeignKey(to="Author")
     9   book = models.ForeignKey(to="Book")
    10 class Meta:
    11   unique_together = ("author", "book")

    方式二:通过ManyToManyField自动创建第三张表

    class Book(models.Model):
    title = models.CharField(max_length=32, verbose_name="书名")
    

    # 通过ORM自带的ManyToManyField自动创建第三张表 class Author(models.Model):   name = models.CharField(max_length=32, verbose_name="作者姓名")   books = models.ManyToManyField(to="Book", related_name="authors")

    方式三:设置ManyTomanyField并指定自行创建的第三张表

    class Book(models.Model):
      title = models.CharField(max_length=32, verbose_name="书名")
    
    # 自己创建第三张表,并通过ManyToManyField指定关联
    class Author(models.Model):
      name = models.CharField(max_length=32, verbose_name="作者姓名")
      books = models.ManyToManyField(to="Book", through="Author2Book", through_fields=("author", "book"))
    
    # through_fields接受一个2元组('field1','field2'):
    # 其中field1是定义ManyToManyField的模型外键的名(author),field2是关联目标模型(book)的外键名 
    class Author2Book(models.Model):
      author = models.ForeignKey(to="Author")
      book = models.ForeignKey(to="Book")
    class Meta:
      unique_together = ("author", "book")

    取舍

    当我们需要在第三张关系表中存储额外的字段时,就要使用第三种方式

    但是当我们使用第三种方式创建多对多关联关系时, 就无法使用set、add、remove、clear方法来管理多对多的关系了,

    需要通过第三张表的model来管理多对多关系

    元信息

      ORM对应的类里面包含另一个Meta类,而Meta类封装了一些数据库的信息 主要字段如下:

    • db_table ORM在数据库中的表名默认是 app_类名,可以通过db_table可以重写表名
    • index_together 联合索引
    • unique_together 联合唯一索引
    • ordering 指定默认按什么字段排序
      • 只有设置了该属性,我们查询到的结果才可以被reverse()

     栗子:

    class Author2Book(models.Model):
      author = models.ForeignKey(to="Author")
      book = models.ForeignKey(to="Book")
      def __str__(self):
        return self.name
      class Meta:
        db_table = "author2book"
        unique_together = ("author", "book")
  • 相关阅读:
    STL源码剖析之_allocate函数
    PAT 1018. Public Bike Management
    PAT 1016. Phone Bills
    PAT 1012. The Best Rank
    PAT 1014. Waiting in Line
    PAT 1026. Table Tennis
    PAT 1017. Queueing at Bank
    STL源码剖析之list的sort函数实现
    吃到鸡蛋好吃,看看是哪只母鸡下的蛋:好用的Sqlite3
    cJSON
  • 原文地址:https://www.cnblogs.com/shijieli/p/10049222.html
Copyright © 2011-2022 走看看