【问题标题】:What is the expected behaviour when a model has two foreign keys with different on_delete constraints?当模型有两个具有不同 on_delete 约束的外键时,预期的行为是什么?
【发布时间】:2021-06-13 22:24:44
【问题描述】:

假设我有这个模型:

class UserBook(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE, unique=True)
    book = models.ForeignKey(Book, on_delete=models.PROTECT)

用户一次只能借一本书。如果用户被删除,我希望此模型的实例被删除,但如果一本书被删除,我不希望它们被删除(错误地,只是预防措施)。

使用上述约束删除用户时的预期行为是什么?我得到:

无法删除模型“UserBook”的某些实例,因为它们是 通过受保护的外键引用

有没有办法实现我想要的?我试图删除 pre_save/post_save 信号上的 UserBook,User 作为发件人,但都没有成功。

【问题讨论】:

  • 可能有另一个模型具有UserBookon_delete=models.PROTECT 的外键。
  • @AbdulAzizBarkat 只是仔细检查了一下,事实并非如此。

标签: django


【解决方案1】:

您想要实现的目标是通过RESTRICT 选项完成的。

这里是来自官方docs的例子

他们还使用models.ForeignKey 而不是models.OneToOne

这篇文章也可能有帮助https://stackoverflow.com/a/38389488/13482680

【讨论】:

  • RESTRICT 确实解决了这个问题。不幸的是,它相当新(> = 3.1),因此如果不升级就无法使用它。谢谢!
  • 我利用这个机会升级了 Django,现在它可以按照我的意愿完美运行。再次感谢!
猜你喜欢
  • 2019-06-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-22
  • 1970-01-01
  • 2015-05-25
相关资源
最近更新 更多