微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Django:ORM关系字段

一,ForeignKey

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

ForeignKey可以和其他表做关联关系同时也可以和自身做关联关系。

1,字段参数

to

设置要关联的表

to_field

设置要关联的表的字段

related_name

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

例如:

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

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

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(可执行对象)

copy">复制代码

def func():
    return 10

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


<div class="cnblogs_code_toolbar"><span class="cnblogscode
copy"><a title="复制代码">

<img src="/res/2019/02-25/18/51e409b11aa51c150090697429a953ed.gif" alt="复制代码">

db_constraint

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

二,OnetoOneField

一对一字段。

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

1,字段参数

to

设置要关联的表。

to_field

设置要关联的字段。

on_delete

同ForeignKey字段。

三,ManyToManyField

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

1,字段参数

to

设置要关联的表

related_name

同ForeignKey字段。

related_query_name

同ForeignKey字段。

symmetrical

仅用于多对多自关联时,指定内部是否创建反向操作的字段。认为True。

举个例子:

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属性进行反向查询

through

在使用ManyToManyField字段时,Django将自动生成一张表来管理多对多的关联关系。

但我们也可以手动创建第三张表来管理多对多关系,此时就需要通过through来指定第三张表的表名。

through_fields

设置关联的字段。

db_table

认创建第三张表时,数据库中表的名称

2,元信息

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

db_table

ORM在数据库中的表名认是 app_类名,可以通过可以重写表名。

index_together

联合索引。

unique_together

联合唯一索引。

ordering

指定认按什么字段排序。

只有设置了该属性,我们查询到的结果才可以被reverse()。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐