zoukankan      html  css  js  c++  java
  • Django框架(十一)—— 常用字段、参数、元信息、多对多关联关系

    常用字段和参数

    一、ORM字段

    # AutoField()
    int自增列,必须填入参数 primary_key=True。当model中如果没有自增列,则自动会创建一个列名为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()实例
    
    # DecimalField(Field)
    10进制小数
      参数:
         max_digits,小数总长度
         decimal_places,小数位长度
        
    # TextField(Field)
    文本类型
    
    # FilePathField(Field)
    字符串,Django Admin以及ModelForm中提供读取文件夹下文件的功能
      参数:
          path,                      文件夹路径
          match=None,                正则匹配
          recursive=False,           递归下面的文件夹
          allow_files=True,          允许文件
          allow_folders=False,       允许文件夹
    
    # FileField(Field)
    字符串,路径保存在数据库,文件上传到指定目录
      参数:
          upload_to = ""      上传文件的保存路径
          storage = None      存储组件,默认django.core.files.storage.FileSystemStorage
        
    

    二、ORM参数

    # null
    用于表示某个字段可以为空,null=True
    
    # unique
    如果设置为unique=True 则该字段在此表中必须是唯一的 
    
    # db_index
    如果db_index=True 则代表着为此字段设置索引
    
    # default
    为该字段设置默认值
    
    
    # DateField和DateTimeField的两个参数
    
    # auto_now_add
    配置auto_now_add=True,创建数据记录的时候会把当前时间添加到数据库
    
    # auto_now
    配置上auto_now=True,每次更新数据记录的时候会更新该字段
    
    

    三、关系字段

    1、ForeignKey

    外键类型在ORM中用来表示外键关联关系,一般把ForeignKey字段设置在 '一对多'中'多'的一方

    # to
    设置要关联的表
    
    # to_field
    设置要关联的表的字段
    
    # related_name  (一般不使用)
    反向操作时,使用的字段名,用于代替原反向查询时的'表名_set'
    
    # related_query_name    (一般不使用)
    反向查询操作时,使用的连接前缀,用于替换表名
    
    # on_delete
    在Django1.X版本中,默认是级联的;在Django2.X版本中,需要手动设置级联
    当删除关联表中的数据时,当前表与其关联的行的行为
    
      models.CASCADE
      删除关联数据,与之关联也删除
    
      models.DO_NOTHING
      删除关联数据,引发错误IntegrityError
    
      models.PROTECT
      删除关联数据,引发错误ProtectedError
    
      models.SET_NULL
      删除关联数据,与之关联的值设置为null(前提FK字段需要设置为可空)
    
      models.SET_DEFAULT
      删除关联数据,与之关联的值设置为默认值(前提FK字段需要设置默认值)
    
      models.SET
      删除关联数据,
      a. 与之关联的值设置为指定值,设置:models.SET(值)
      b. 与之关联的值设置为可执行对象的返回值,设置:models.SET(可执行对象)
    
    # db_constraint
    是否在数据库中创建外键约束,默认为True
        
    

    2、OneToOneFiled

    通常一对一字段用来扩展已有字段

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

    3、ManyToManyField

    用于表示多对多的关联关系。在数据库中通过第三张表来建立关联关系

    # to
    设置要关联的表
    
    # related_name      (一般不做替换)
    同ForeignKey字段
    
    # related_query_name     (一般不用)
    同ForeignKey字段
    
    # symmetrical
    仅用于多对多自关联时,指定内部是否创建反向操作的字段。默认为True
    
    # through
    在使用ManyToManyField字段时,Django将自动生成一张表来管理多对多的关联关系
    但我们也可以手动创建第三张表来管理多对多关系,此时就需要通过through来指定第三张表的表名
    
    # through_fields
    设置关联的字段
    
    # db_table
    默认创建第三张表时,数据库中表的名称
    
    

    四、元信息

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

    # db_table
    ORM在数据库中的表名默认是 app_类名,可以通过db_table可以重写表名
    
    # index_together
    联合索引
    
    # unique_together
    联合唯一索引
    
    # ordering
    指定默认按什么字段排序
    

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

    1、通过ManyToManyField自动创建第三张表

    class Book(models.Model):
        name = models.CharField(max_length=32)
        authors = models.ManyToManyField(to='Author')
        
    class Author(models.Model):
        name = models.CharField(max_length=32)
        
    

    2、利用ForeignKey自行创建第三张表

    class Book(models.Model):
        name = models.CharField(max_length=32)
        
    class Author(models.Model):
        name = models.CharField(max_length=32)
    
    class Book2Author(models.Model):
        book = models.ForeignKey(to='Book')
        author = models.ForeignKey(to='Author')
        class Meta:
            unique_together = ('book','author')
            
    

    3、设置ManyTomanyField并指定自行创建的第三张表

    class Book(models.Model):
        name = models.CharField(max_length=32)
        authors = models.ManyToManyField(to='Author',through='Book2Author',through_fields=('book','author'))
        
    class Author(models.Model):
        name = models.CharField(max_length=32)
        
    class Book2Author(models.Model):
        book = models.ForeignKey(to='Book')
        author = models.ForeignKey(to='Author')
        class Meta:
            unique_together = ('book','author')
    
    # 当我们需要在第三张关系表中存储额外的字段时,就要使用该方式
    # 当我们使用第三种方式创建多对多关联关系时,就无法使用set、add、remove、clear方法来管理多对多的关系了,需要通过第三张表的model来管理多对多关系
    
  • 相关阅读:
    Palindrome Partitioning
    Minimum Path Sum
    Maximum Depth of Binary Tree
    Minimum Depth of Binary Tree
    Unique Binary Search Trees II
    Unique Binary Search Trees
    Merge Intervals
    Merge Sorted Array
    Unique Paths II
    C++ Primer Plus 笔记第九章
  • 原文地址:https://www.cnblogs.com/linagcheng/p/9960226.html
Copyright © 2011-2022 走看看