Django admin将所选项目的内联线的外键设置为Null,而不是delete

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项在内联

我有一个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项在内联线中被编辑,我想实现的是,当编辑(比如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只是将其从数据库中删除。您是否已经尝试过此方法?如果是这样,请在删除时显示一些打印屏幕好吗?(只是为了确保我们讨论的是相同类型的删除)