【问题标题】:Django admin inline with custom queryset带有自定义查询集的 Django 管理员内联
【发布时间】:2018-03-08 22:44:30
【问题描述】:

我有两个模型:

class Parent:
   ...

class Child:
   parent = models.ForeignKey(Parent)

Parent 的模型管理员中,我想通过自定义查询集显示 Child 的内联,而不仅仅是通过 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})
    ...

【问题讨论】:

    标签: django


    【解决方案1】:

    您必须重写 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
    

    【讨论】:

    • 没用。我需要的是忽略使用 FK 字段的超类过滤器。
    • 我已经更新了我的答案。请检查并告诉我这是否有效?
    • 如果我们需要访问请求或用户对象怎么办?
    • 它在 Django 2.2.5 中不起作用。 self.queryset 被忽略。我总是得到所有数据
    • @hipertracker 请使用 .get_queryset() 而不是 .queryset
    【解决方案2】:

    旧答案不再适用于当前的 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
    

    【讨论】:

    猜你喜欢
    • 2016-07-28
    • 2019-05-26
    • 1970-01-01
    • 2013-04-05
    • 2022-10-19
    • 2016-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多