zoukankan      html  css  js  c++  java
  • Django之ORM字段相关

    字段和参数

    常用字段

    字段 说明
    AutoField int类型,自增列,必须填入参数primary_key=True.
    IntegerField   整数类型,范围在 -2147483648 to 2147483647。
    CharField 字符串类型,必须提供max_length参数,表示字符长度。
    DateField 日期字段,格式 YYYY-MM-DD,相当于Python中的datetime.date()实例
    DateTimeField 日期时间字段,格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ],相当于Python中的datetime.datetime()实例。
    字符合集

    注意:model中没有设置自增列时,其会自动生成一个名为id的列。

    自定义字段

    class FixedCharField(models.Field):
        """
        自定义的char类型的字段类
        """
        def __init__(self, max_length, *args, **kwargs):
            self.max_length = max_length
            super(FixedCharField, self).__init__(max_length=max_length, *args, **kwargs)
    
        def db_type(self, connection):
            """
            限定生成数据库表的字段类型为char,长度为max_length指定的值
            """
            return 'char(%s)' % self.max_length
    # 自定义类的命名可以随意,需继承models.Field的属性
    
    class Grader(models.Model):
        id = models.AutoField(primary_key=True)
        title = models.CharField(max_length=25)
        # 使用自定义的char类型的字段
        cname = FixedCharField(max_length=25)
    自定义char类型示例

    ORM字段与数据库中字段的对应关系

    对应关系:
        'AutoField': 'integer AUTO_INCREMENT',
        'BigAutoField': 'bigint AUTO_INCREMENT',
        'BinaryField': 'longblob',
        'BooleanField': 'bool',
        'CharField': 'varchar(%(max_length)s)',
        'CommaSeparatedIntegerField': 'varchar(%(max_length)s)',
        'DateField': 'date',
        'DateTimeField': 'datetime',
        'DecimalField': 'numeric(%(max_digits)s, %(decimal_places)s)',
        'DurationField': 'bigint',
        'FileField': 'varchar(%(max_length)s)',
        'FilePathField': 'varchar(%(max_length)s)',
        'FloatField': 'double precision',
        'IntegerField': 'integer',
        'BigIntegerField': 'bigint',
        'IPAddressField': 'char(15)',
        'GenericIPAddressField': 'char(39)',
        'NullBooleanField': 'bool',
        'OneToOneField': 'integer',
        'PositiveIntegerField': 'integer UNSIGNED',
        'PositiveSmallIntegerField': 'smallint UNSIGNED',
        'SlugField': 'varchar(%(max_length)s)',
        'SmallIntegerField': 'smallint',
        'TextField': 'longtext',
        'TimeField': 'time',
        'UUIDField': 'char(32)',
    View Code

    字段参数

    字段参数 说明
    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

    建立外键约束,表示多对一或一对多关系,外键字段一般设置在关系中‘’多‘’的那一方。

    字段参数

    to:设置要关联的表

    to_field:设置要关联的表的字段

    示例

    class Publisher(models.Model):
        id = models.AutoField(primary_key=True)
        name=models.CharField(max_length=32)
    
    class Book(models.Model):
        id=models.AutoField(primary_key=True)
        title=models.CharField(max_length=16)
        publisher=models.ForeignKey(to=Publisher,to_field=id)

    on_delete

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

    参数设置 说明
    on_delete=models.CASCADE 删除关联数据,关联关系也删除
    on_delete=models.DO_NOTHING 删除关联数据,引发错误IntegrityError
    on_delete=models.PROTECT 删除关联数据,引发错误ProtectedError
    on_delete=models.SET_NULL 删除关联数据,与之关联的值设置为null(外键字段设置可为空的前提下)
    on_delete=models.SET_DEFAULT 删除关联数据,与之关联的值设置为默认值(外键字段设置了默认值的前提下)
    on_delete=models.SET 删除关联数据,设置与之关联的值,设置见下

    model.SET值的设置

    1、设置指定值:model.SET(value)

    2、设置可执行对象的返回值:model.SET(可执行对象)

    def func():
        return 10
    
    class MyModel(models.Model):
        user = models.ForeignKey(
            to="User",
            to_field="id",
            on_delete=models.SET(func)
        )
    # MyModel表关联到User表。
    设置值示例

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

    OneToOneField

    建立表与表的一对一关系。一对一关系的两张表也可以合二为一。

    class User(models.Model):
         name = models.CharField(max_length=16)
         gender_choice = ((1, ""), (2, ""), (3, "保密"))
         gender = models.SmallIntegerField(choices=gender_choice, default=3)
         detail = models.OneToOneField(to='UserInfo')
    
    
     class UserInfo(models.Model):
         phone = CharField(max_length=16, unique=True, db_index=True)
         addr = models.TextField()
         married = models.BooleanField()
    
    # 此2张表记录的是同一个人的信息,常用信息和其他信息分别放于2张表中,可以避免放于一张表中信息繁冗,降低检索速率。

    字段参数

    参数 说明
    to 设置要关联的表
    to_field 设置要关联的字段
    on_delete 同上foreignkey字段

    ManyToManyField

    建立两张表的多对多关系

    字段参数

    to:设置要关联的表

    db_table:自动生成第3张表时,用此来设置该表的默认名称

     through:手动生成第3张表时,多对多关系的建立通过throng指定第3张表。

    through_fields:手动生成第3张表时,多对多关系的建立通过throng_fields指定有多对多关系的2张表。

    class Book(models.Model):
        title = models.CharField(max_length=32)
    
    
    class Author(models.Model):
        name = models.CharField(max_length=32)
        #
        books = models.ManyToManyField(
            to="Book",
            through="Book2Author",
            through_fields=('author', 'book')
        )
    
    
    # 自己创建第三张表
    class Book2Author(models.Model):
        id = models.AutoField(primary_key=True)
        book = models.ForeignKey(to=Book)
        author = models.ForeignKey(to=Author)
        first_blood = models.DateField()
    through示例

    元信息

    ORM对应的类中包含元类(Meta类),Meta类中封装的数据库信息如下

    db_table ORM中创建的数据库名默认为app_类名,可以用此来设置数据库的命名
    index_together 联合索引
    unique_together 联合唯一索引
    ordering 指定默认按某字段排序
    class Author(models.Model):
        name = models.CharField(max_length=32)
        books = models.ManyToManyField(to="Book", db_table="author2book")
    
        class Meta:
            db_table = "author"
    
    
    # 设置命名后ORM生成的数据库名称为指定名称。
    设置数据库命名示例
  • 相关阅读:
    Base64简介
    grafana+graphit安装笔记
    朋友圈里的格局
    设计模式值六大原则——接口隔离原则 (ISP)
    设计模式值六大原则——迪米特法则(LoD)也称为最少知识原则(LKP)。
    设计模式值六大原则——开闭原则(OCP)
    设计模式值六大原则——里氏替换原则(LSP)
    工厂模式
    JSON简介以及用法代码汇总
    sql where 1=1和 0=1 的作用
  • 原文地址:https://www.cnblogs.com/mingkong-z/p/9204787.html
Copyright © 2011-2022 走看看