博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Django之ORM字段相关
阅读量:6928 次
发布时间:2019-06-27

本文共 4902 字,大约阅读时间需要 16 分钟。

字段和参数

常用字段

字段 说明
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 10class 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

你可能感兴趣的文章
python下载文件的几种常用方法
查看>>
运维自动化之ansible的安装与使用(包括模块与playbook使用)
查看>>
怎么样才叫精通Linux
查看>>
自动Shader优化器glsl_optimizer的编译与使用
查看>>
ZoneMinder配置与使用
查看>>
《VMware系统集成工程师》课程大纲
查看>>
在VMware ESXi中使用固态硬盘的注意事项
查看>>
戴尔“蓝雷”炸响软件定义存储
查看>>
华为PowerApp为开发者提供“能量”
查看>>
磁盘性能 -- IOPS 和 吞吐量 说明
查看>>
制作Ubuntu deb包方法
查看>>
WinForm 跨进程传输数据
查看>>
[zz]HDFS文件系统和OpenStack swift对象存储有何不同
查看>>
jdk安装配置
查看>>
数据类型范围》
查看>>
Miller-Rabin素数测试学习笔记
查看>>
Wireshark运行问题:"The NPF driver isn’t running…"(NPF驱动没有运行)
查看>>
STM32使用ST库新建工程
查看>>
我们工作到底为了什么
查看>>
关于“VisualSVN-2.5.2”的破解
查看>>