Django admin将所选项目的内联线的外键设置为Null,而不是delete
我有一个AB型,它有两个外键a_id和B_id。Django admin将所选项目的内联线的外键设置为Null,而不是delete,django,django-admin,foreign-keys,Django,Django Admin,Foreign Keys,我有一个AB型,它有两个外键a_id和B_id。 class AB(models.Model): A_id = models.ForeignKey('A') B_id = models.ForeignKey('B') field_1 = models.CharField(max_length=200, blank=True) field_2 = models.CharField(max_length=200, blank=True) 当编辑A或B时,AB项在内联
class AB(models.Model):
A_id = models.ForeignKey('A')
B_id = models.ForeignKey('B')
field_1 = models.CharField(max_length=200, blank=True)
field_2 = models.CharField(max_length=200, blank=True)
当编辑A或B时,AB项在内联线中被编辑,我想实现的是,当编辑(比如B)时,我想保留所选的AB项,并将外键B_id设置为null,而不是删除它们。谢谢你的提示如果我理解正确,你想要的是防止级联删除。 如果是这种情况,您需要指定django在删除A或B模型时应该做什么。 发件人: 当删除ForeignKey引用的对象时,Django默认情况下会模拟DELETE CASCADE上SQL约束的行为,并删除包含ForeignKey的对象。可以通过指定on_delete参数来覆盖此行为。例如,如果您有一个可为null的ForeignKey,并且希望在删除引用的对象时将其设置为null: 要将ForeignKey设置为null,可以按如下方式执行:
A_id = models.ForeignKey('A', null=True, on_delete=models.SET_NULL)
B_id = models.ForeignKey('B', null=True, on_delete=models.SET_NULL)
祝你好运,希望这能有所帮助。我在这里结束,因为我有同样的问题。我认为前面的答案忽略了这里的问题——这里的用例是用户在
InlineModelAdmin
上选中“delete”复选框,而不是删除外键链接的模型
我认为你可以简化原来的问题,只考虑模型B有一个空的外键来建模A:
class A(models.Model):
pass
class B(models.Model):
linked_a = models.ForeignKey(A, null=True)
然后管理员使用内联列表列出每个链接到A的B:
class BInline(TabularInline):
model = B
class AModelAdmin(ModelAdmin):
inlines = [BInline]
问题是,有没有办法使BInline
上的“delete”复选框导致B.linked\u a=None
而不是删除B的实例
这看起来像是一个逻辑操作的原因是,如果使用ManyToManyField
连接这两个对象,就会发生这种情况——它不会删除B,只会“取消”它的链接
不幸的是,就我所知,答案是你不能轻易做到这一点。在这两种情况下,内联都显示数据库行,但当
ForeignKey
的内联显示相关对象本身时,ManyToManyField
的内联显示联接表中的一行(例如关系)。因此,就数据库操作而言,“删除”操作是相同的,只是在一种情况下删除相关对象,在另一种情况下删除关系。您可以使用自定义内联表单集并覆盖django 1.11+中提供的方法
from django.forms.models import BaseInlineFormSet
from django.db import models
from django.contrib import admin
class Publisher(models.Model):
pass
class Book(models.Model):
publisher = models.ForeignKey(Publisher, null=True)
class CustomInlineFormSet(BaseInlineFormSet):
def delete_existing(self, obj, commit=True):
"""Unhook a model instead of deleting it."""
if commit:
obj.publisher = None
obj.save()
class BooktInline(admin.TabularInline):
formset = CustomInlineFormSet
这将更改它,以便管理员内联表单集上的“删除”操作将取消内联模型的挂钩,而不是将其删除。AFAIK,这在选择要在附加内联中删除的元素时无效,django只是将其从数据库中删除。您是否已经尝试过此方法?如果是这样,请在删除时显示一些打印屏幕好吗?(只是为了确保我们讨论的是相同类型的删除)