![](/img/trans.png)
[英]In Django, how to get all instances of a model where an instance of another model related to the first by fk does not exist?
[英]Cannot delete some instances of model because of FK
Python 3.6 和 Django 1.11.7。
我有兩個模型如下所示:
class User():
name = models.CharField()
...
class UserInfo():
user = models.OneToOneField(User, on_delete=models.PROTECT, primary_key=True, related_name='info')
我想刪除一些用戶實例 A,我明確刪除了用戶 A 的信息。 但是當我嘗試刪除用戶 model user.delete()
時,我得到了ProtecedError
:
ProtectedError: ("Cannot delete some instances of model 'User' because they are referenced through a protected foreign key: 'UserInfo.user'", <QuerySet [<UserInfo: UserInfo object>]>)
然后我嘗試將刪除放在 try/catch 中,如下所示:
try:
user.delete()
except ProtectedError:
UserInfo.objects.filter(user=user).delete()
user.delete()
但仍然有同樣的例外。 我的操作可能出了什么問題?
您正在相關對象上使用保護子句:
on_delete=models.PROTECT
您可以在以下文檔中查看它:
https://docs.djangoproject.com/en/2.2/ref/models/fields/#django.db.models.ForeignKey.on_delete
你在這里指出:
PROTECT [來源] 通過引發 django.db.IntegrityError 的子類 ProtectedError 來防止刪除引用的 object。
刪除user
字段上的on_delete=models.PROTECT
。 並運行manage.py makemigrations
對於on_delete
參數, ForeignKey
字段的默認值為CASCADE
。 這意味着刪除用戶 object 將級聯並刪除鏈接到該用戶的用戶信息 object。
看起來這是您正在尋找的行為。
您可以在文檔文檔中閱讀有關此內容的更多信息
另請注意,盡管on_delete
具有CASCADE
的默認值,但 Django 2.0 將需要此參數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.