【问题标题】:What gets deleted when I delete a model in django (postgress)?当我在 django (postgres) 中删除模型时会删除什么?
【发布时间】:2018-01-12 01:21:16
【问题描述】:

假设我有一个模型书:

class Books(models.Model):
    name = models.Charfield()
    author = models.Charfield()

后来我设置了另一个名为 BookReviews 的模型,它链接到 Books:

class BookReviews(models.Model):
    book = models.ForeignKey(Books)
    content = models.TextField()

但我搞砸了,我想完全删除模型 BookReviews。当我跑步时

python manage.py 迁移

我收到一条警告消息:

通过外键与这些内容类型相关的任何对象也将 被删除。您确定要删除这些内容类型吗?

这是否意味着任何链接到 Books 的条目也将被删除,即使这些条目在 BookReviews 之前存在?

【问题讨论】:

    标签: python django django-models django-migrations


    【解决方案1】:

    我想你想知道ForeignKey 中的on_delete 选项

    当 ForeignKey 引用的对象被删除时,Django 将模拟 on_delete 参数指定的 SQL 约束的行为。例如,如果您有一个可为空的 ForeignKey,并且您希望在删除引用的对象时将其设置为 null:

    删除Books 对象时,所有外部BookReviews 对象都会被删除,因为on_delete=models.CASCADE 是默认值。您的型号与以下相同

        class Books(models.Model):
                name = models.Charfield()
                author = models.Charfield()
    
        class BookReviews(models.Model):
                book = models.ForeignKey(
                        Books,
                        on_delete=models.CASCADE,
                )
                content = models.TextField()
    

    如果你不想自动删除BookReviews,你可以使用其他on_delete选项,像这样

        class BookReviews(models.Model):
                book = models.ForeignKey(
                        Books,
                        on_delete=models.SET_NULL,
                        blank=True,
                        null=True,
                )
    

    django 文档中有很多有用的示例,请查看here 了解更多信息。

    附: django 2.0 版本以后,写FroeignKey 字段时应该写on_delete 选项。

    【讨论】:

      猜你喜欢
      • 2019-01-01
      • 2023-03-17
      • 2011-07-19
      • 1970-01-01
      • 1970-01-01
      • 2017-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多