标题:django关系数据类型 | 作者: catfish | 时间:2019年12月03日
暂无法显示图片

来源

http://www.liujiangblog.com/course/django/96

OneToField和ForeignKey参数用法

on_delete —— 2.0版本后必须要设置

CASCADE:              模拟SQL语言中的ON DELETE CASCADE约束,将定义有外键的模型对象同时删除!(该操作为当前Django版本的默认操作!)

PROTECT:                 阻止上面的删除操作,但是弹出ProtectedError异常

SET_NULL:            将外键字段设为null,只有当字段设置了null=True时,方可使用该值。

SET_DEFAULT:       将外键字段设为默认值。只有当字段设置了default参数时,方可使用。

DO_NOTHING:     什么也不做。

SET():                      构建一个返回一条数据的对象的回调函数,函数名用SET包裹。表示当它删除之后采用的默认值代替。

related_name —— 自定义反向关联

OneToOneField

OneToOneField表示一对一数据模型,一般用于系统自带表的延伸与扩展。

默认反向关联

默认反向关联是模型的表名。

常见的使用和参数

用法和外键一样。

a = models.OneToOneField(Box, on_delete=models.CASCADE, related_name="b")

有几个参数确认一下:on_delete, related_name, related_query_name。

ForeignKey

ForeignKey表示多对一数据模型,极为常用。

默认反向关联

默认反向关联是表名_set。

常见的使用和参数

用法和OneToOneField一样。不同的是,ForeignKey必须要设置在较多的数据类型。

from django.contrib.auth.models import User
author = models.ForeignKey(User, on_delete=models.CASCADE, related_name="hello")

ManyToManyField

ManyToManyField表示多对多数据模型。

默认反向关联

默认反向关联是表名_set。使用add与remove方法来增减关联数。

常见的使用和参数

常见使用如下:

from django.contrib.auth.models import User
author = models.ManyToManyField(User, related_name="hello")

注意点:

1,当第一个参数类名为' self '时候,这个字段不会出现反向关联。

2,这个参数没有on_delete属性。

3,ManyToMany设置在两个表的任意一个表上都可以。

4,自定义中间表。     要求:1# 在一个表上设置多对多关联。2# 多对多关联中设置through和through_field属性。3# 中间表上要设置两个外键。

from django.db import models

class Person(models.Model):
    name = models.CharField(max_length=50)

class Group(models.Model):
    name = models.CharField(max_length=128)
    members = models.ManyToManyField(
        Person,
        through='Membership',       ## 自定义中间表
        through_fields=('group', 'person'),
    )

class Membership(models.Model):  # 这就是具体的中间表模型
    group = models.ForeignKey(Group, on_delete=models.CASCADE)
    person = models.ForeignKey(Person, on_delete=models.CASCADE)
    inviter = models.ForeignKey(
        Person,
        on_delete=models.CASCADE,
        related_name="membership_invites",
    )
    invite_reason = models.CharField(max_length=64)

多态关系Contenttype

与外键功能上来说是等效相同的,唯一区别是外键只关联一个类,而它能关联所有类。

常见的使用和参数

常见的用法构造如下,由于它可以关联所有的类型,所以,没有确切的关联类型的对象。

from django.db import models
from django.contrib.contenttypes.fields import GenericForeignKey
from django.contrib.contenttypes.models import ContentType

class ReadDetail(models.Model):
    read_num = models.IntegerField(default=0)

    content_type = models.ForeignKey(ContentType, on_delete=models.DO_NOTHING)   # 会获得一个所有类型的列表,给你选择。
    object_id = models.PositiveIntegerField()                   # 通过指定该类型,和该类型的pk来确定那个对象是谁。
    content_object = GenericForeignKey('content_type', 'object_id')   # 没有对应的表单组建,以上三者中在admin中只需要写这一个即可。

正向关联与反向关联

正向关联:content_object

反向关联:

from django.contrib.contenttypes.fields import GenericRelation
from django.db import models

class Message(models.Model):
    article = GenericRelation(ReadDetail)

定义完后article就是它的反向关联。

我要评论

没有登录?请先登录后再评论

最新评论
暂无法显示图片 catfish

           2020年5月10日 18:35

沙发

回复