禁止Django自引用外键指向自我对象

iTa*_*ayb 4 python django django-1.10

我有一个常规的自我引用外键:

idol = models.ForeignKey("self", on_delete=models.CASADE)
Run Code Online (Sandbox Code Playgroud)

管理页面允许我选择相同的对象ID.如何阻止django管理员表单显示?

ndp*_*dpu 6

您可以formfield_for_foreignkey在类的子类中覆盖ModelAdmin.

ModelAdmin上的formfield_for_foreignkey方法允许您覆盖外键字段的默认表单字段.

父对象id可以保存在change_view方法中:

class IdolAdmin(admin.ModelAdmin):
    def change_view(self, request, object_id, form_url='', extra_context=None):
        self.object_id = object_id
        return super(IdolAdmin, self).change_view(
            request, object_id, form_url, extra_context=extra_context,
        )

    def formfield_for_foreignkey(self, db_field, request, **kwargs):
        if db_field.name == "idol":
            kwargs['queryset'] = Idol.objects.exclude(pk=self.object_id)
        return super(IdolAdmin, self).formfield_for_foreignkey(
            db_field, request, **kwargs)
Run Code Online (Sandbox Code Playgroud)