Django管理员内联自定义查询集

时间:2017-09-27 12:33:04

标签: django

我有两个型号:

class Parent:
   ...

class Child:
   parent = models.ForeignKey(Parent)

父级的模型管理员中,我希望使用自定义查询集显示子级的内联,而不仅仅是通过fk字段​​与父级相关的内容

我试过了:

class ChildInline(admin.TabularInline):
   model = Child
   def get_queryset(self, request):
      return Child.objects.filter(<my custom filter>)

class ParentAdmin(admin.ModelAdmin):
   inlines = [ChildInline]

但内联中显示的唯一子项是那些满足两个过滤器的子项:与FK +我的自定义过滤器的父项相关。

是否可以这样做?

编辑:

我现在看到的是BaseInlineFormSet正在过滤我创建的查询集,只保留与父项相关的子项,任何想法如何避免这种情况?

django/forms/models.py

class BaseInlineFormSet(BaseModelFormSet):
    ...
    if self.instance.pk is not None:
       qs = queryset.filter(**{self.fk.name: self.instance})
    ...

2 个答案:

答案 0 :(得分:7)

您必须覆盖BaseInlineFormSet的__init__()方法并更新其查询集。

from django.forms.models import BaseInlineFormSet

class ChildInlineFormSet(BaseInlineFormSet):

    def __init__(self, *args, **kwargs):
        super(ChildInlineFormSet, self).__init__(*args, **kwargs)
        # Now we need to make a queryset to each field of each form inline
        self.queryset = Child.objects.filter(<my custom filter>)

然后使用 ChildInlineFormSet

初始化formset属性
class ChildInline(admin.TabularInline):
    model = Child
    formset = ChildInlineFormSet
    extra = 0

答案 1 :(得分:5)

对于当前的Django 2.2或3,旧答案不再有效,因为self.queryset被忽略了

当前的解决方案是覆盖get_queryset

from django.forms.models import BaseInlineFormSet

class ChildInlineFormSet(BaseInlineFormSet):

    def get_queryset(self):
        qs = super(ChildInlineFormSet, self).get_queryset()
        return qs.filter(<custom query filters>)

class ChildInline(admin.TabularInline):
    model = Child
    formset = ChildInlineFormSet
    extra = 0