我有两个型号:
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})
...
答案 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