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生成的数据库名称为指定名称。
设置数据库命名示例
原文地址:https://www.cnblogs.com/mingkong-z/p/9204787.html