美文网首页
django 模型关系

django 模型关系

作者: eeert2 | 来源:发表于2020-03-05 15:47 被阅读0次

django 模型间的关系分为多对一一对一多对多

一、多对一关系

1.1 创建多对一模型model

通过ForeignKey可以实现django的多对一关系关联,

class ForeignKey( to, on_delete, related_name=None, related_query_name=None,
                 limit_choices_to=None, parent_link=False, to_field=None,
                 db_constraint=True, **kwargs)

其中两个位置参数to, on_delete为必须传入的参数

from django.db import models

class Author(models.Model):
        username = models.CharField('作者', max_length = 32)

class Article(models.Model):
    title = models.CharField(max_length=64)
    content = models.TextField()

    # 关联`Author`类
    author = models.ForeignKey(
        Author,
        on_delete=models.CASCADE # 这里先这么进行设置
    )

如果需要在尚未定义的模型上创建关系,则可以使用模型的名称,而不是模型对象本身:

class Article(models.Model):
    title = models.CharField(max_length=64)
    content = models.TextField()
    author = models.ForeignKey(
        'Author',
        on_delete=models.CASCADE
    )


class Author(models.Model):
    username = models.CharField('作者', max_length=32)

上述完成了将Article - Author 关联成多对一关系。


1.2 多对一模型之间访问
  1. 正向访问
    在上面模型关系中,Article拥有一个author属性,该属性实际存储了Authorid,我们可以通过.author获取Author对象。

二、模型关系的参数设置

  • on_delete表示删除外键时,引起sql行为.
    on_delete可以为以下值,它们都可以从django.db.models导入:
  1. CASCADE : 表示联级删除。

例如在上述Article中,我们设置on_delete=models.CASCADE
这表示当我们删除某一个Author对象时,该Author对象反向关联的所有Article数据将被django自动删除。这是为了防止产生无意义数据

因为在很多多对一关系对象中,我们并不直接访问Article,而是通过Author来间接访问Article,当我们删除Author时,也就表示不再访问Article,这个时候也应该随之将Article,否则就会产生无法访问的脏数据, CASCADE约束就是为了防止我们忘记删除关联的数据,特别是当多个数据表关联了该ForeignKey

建议谨慎使用CASCADE

  1. PROTECT: 通过引发ProtectedError来防止删除引用的对象

设置on_delete = CASCADE后,将由django自动帮我们进行删除,且没有提醒,我们会觉得这有一定的风险,Author关联的Article是否都是没有用的呢?是不是要留下一些呢?

PROTECT在删除ForeignKey前会检查被关联的对象是否都已经被删除,如果没有就会引起ProtectedError异常。这就需要我们手动删除关联的对象后,再删除ForeignKey对象。

def delete_ Author(pk):
    author = Author.objects.get(pk=pk)

    # 手动删除 articles
    articles = author.article_set.all()
    for article in articels:
        article.delete()

    author.delete()
  1. SET_NULL
    允许我们删除ForeignKey对象,且删除后会保留相关联的对象,并将ForeignKey设置为null
class Article(models.Model):
    title = models.CharField(max_length=64)
    content = models.TextField()
    author = models.ForeignKey(
        'Author',
        on_delete=models.CASCADE,
        null=True # 必须设置 
    )

只有当on_delete=SET_NULL时,才能设置null=True

  1. SET_DEFAULT
    ForeignKey设置为默认值,此时必须设置default属性,这里表示删除指定Author对象后,该Author对象相关联的Articleauthor设置为默认值。
    例如用户注销账号后,用户的评论信息保留,在个时候用户名显示该用户已注销,就是我们的删除用户后设置的默认用户。

  2. SET()
    SET_DEFAULT中,默认值是固定的,但是很多时候我们的默认值可能是在变化的,使用SET()可以传递callable,调用它的结果赋值给设置ForeignKey的字段

def get_first_author():
    return Author.objects.all().first()

class Article(models.Model):
    title = models.CharField(max_length=64)
    content = models.TextField()
    author = models.ForeignKey(
        'Author',
        on_delete=models.SET(get_first_author),
    )
  1. DO_NOTHING 什么都不做,不采取行动。

相关文章

  • Django模型

    Django是怎么链接数据库的呢。 django模型映射关系:模型类 >>>>>>>>>>>>>>>数据库类属性>...

  • Django 模型间的关系

    Django模型之间的关系 Django模型的对应关系,一对一,一对多,以及多对多的关系。 一对一 OneToOn...

  • Django 2.1.7 模型管理器 models.Manage

    上一篇Django 2.1.7 模型的关联讲述了关于Django模型一对多、多对多、自关联等模型关系。 在查询数据...

  • django 模型关系

    django 模型间的关系分为多对一,一对一,多对多 一、多对一关系 1.1 创建多对一模型model 通过For...

  • django 模型关系

    一对一 一对多 多对多

  • Flask框架

    Django框架---web后端框架 Django重量级框架模型类--->ORM映射对象关系映射(Object R...

  • restful 可写嵌套模型

    Django Rest Framework 嵌套序列化关系模型 序列化模型与序列化关系模型 序列化和反序列化 通俗...

  • Django 序列化

    Django Rest Framework 序列化关系模型 segmentfault.com/a/11900000...

  • Django模型基础中模型的创建与映射(十九)

    一、django模型的映射关系(ORM): 模型类必须都写在app下的models.py文件中。 模型如果需要映射...

  • Model的字段解析和一对一关系实践

    Django进阶,必须深刻了解Django的MTV模式。M 代表模型(Model):负责业务对象和数据库的关系映射...

网友评论

      本文标题:django 模型关系

      本文链接:https://www.haomeiwen.com/subject/fzbxrhtx.html