【问题标题】:Django filters options specific to queryset onlyDjango 仅过滤特定于查询集的选项
【发布时间】:2017-08-04 13:38:48
【问题描述】:

我使用django-filter 在我的网站上的列表视图中提供用户过滤,例如

class MyModel(models.Model):
    fruit = models.ForeignKey(Fruit)
    price = models.CharField(...)
    release_date = models.DateTimeField(...)

class MyFilter(filters.FilterSet):
    ...

    class Meta:
        model = MyModel
        fields = ['fruit', 'price', 'release_date']

def my_banana_orange_view(request):
   ...
   queryset = MyModel.objects.filter(fruit__name__in=['banana', 'orange'])
   filter = Filter(request.GET, queryset=queryset)

   return render(request, 'my_template.html', {'queryset': queryset, 'filter': filter})

现在,如果我这样做,我可以只显示具有香蕉或橙色关系的 MyModel 条目,但 MyFilter 仍将提供 Fruit 模型中所有水果的选项。我正在尝试为 FilterSet 找到一个设置,以仅显示与输入查询集相关的选项,但找不到。一个存在吗?

否则我想我将不得不覆盖过滤器来做这样的事情:

class MyFilter(filters.FilterSet):

    def __init__(self, *args, **kwargs):
        super().__init__(self, *args, **kwargs)

        self.filters['fruit'].extra['queryset'] = Fruit.objects.filter(mymodel=self.queryset)

    class Meta:
        model = MyModel
        fields = ['fruit', 'price', 'release_date']

这似乎有点矫枉过正。仅显示基于输入查询集的选项似乎是理想的行为,但我找不到任何文档。有没有好的方法来做到这一点?任何帮助表示赞赏!

【问题讨论】:

    标签: python django django-filter


    【解决方案1】:

    FilterSet 的第一个参数是data,第二个是queryset

    在你的观点中尝试类似filter = MyFilter(data=request.GET, queryset=queryset) 的东西。

    见:http://django-filter.readthedocs.io/en/develop/guide/usage.html#the-view

    【讨论】:

    • 好的,我错过了示例中的请求信息。这样做仍然会在下拉列表中为我提供 Fruit 模型中的所有条目,而不仅仅是查询集中的条目......
    猜你喜欢
    • 2020-09-14
    • 2018-04-28
    • 1970-01-01
    • 2020-08-22
    • 2019-04-15
    • 2011-09-29
    相关资源
    最近更新 更多