【问题标题】:Django FilterSet set initial valueDjango FilterSet 设置初始值
【发布时间】:2018-01-29 18:43:01
【问题描述】:

我们在项目中使用 Django_Filterset。我被要求为模型中的外键列设置默认过滤器值

class RegFilter(django_filters.FilterSet):

    class Meta:
        model = models.Reg
        fields = {
          'id': ['exact'],
          'nom_id': ['icontains'],
          'nom_name': ['icontains'],
          'product__name': ['icontains']
        }

显示初始屏幕时,产品名称应默认为数据库中已有的产品 - 知道如何实现吗?感谢您的帮助。

【问题讨论】:

  • 您可以在models 中添加default 值,这将有助于创建对象。我认为这不需要任何FilterSet
  • @JerinPeterGeorge - 我试过了,不高兴。
  • 您目前的需求状态如何?
  • @JerinPeterGeorge - 我们需要为产品名称设置一个初始值,以便这是默认查询结果。我不确定如何在过滤器集中设置默认产品名称。
  • 据我了解,每当有人访问您的 REST-API 时,它应该返回一个查询集/一些已经用某些条件过滤的结果。对吗?

标签: django django-rest-framework django-template-filters


【解决方案1】:

我在@Gayathri 给出的答案的基础上修复了一些小问题。他的代码中有一个错字,并且该代码不适用于多项选择字段,因为它们需要MultiValueDict 功能来处理多个条目。

给定一个相当常规的视图,这里是完整的代码(Python3 语法):

class BookListView(FilterView):
    model = Book
    filterset_class = BookFilter

    def get_filterset_kwargs(self, filterset_class):
        kwargs = super().get_filterset_kwargs(filterset_class)
        if kwargs['data'] is None:
            filter_values = MultiValueDict()
        else:
            filter_values = kwargs['data'].copy()

        if not filter_values:
            # we need to use `setlist` for multi-valued fields to emulate this coming from a query dict
            filter_values.setlist('status', ['new', 'ready'])
            filter_values['sorting'] = '-created'

        kwargs['data'] = filter_values

        return kwargs

【讨论】:

    【解决方案2】:

    我设法解决了这个问题,并认为该解决方案可能会帮助遇到与我类似的情况的其他人。

    在views.py中,重写FilterView方法

    def get_filterset_kwargs(self, filterset_class):
        kwargs = super(RegFilter, self).get_filterset_kwargs(filterset_class)
        if kwargs['data'] is None:
            request_dict = {}
        else:
            request_dict = kwargs['data'].dict()
    
        # This default will not be populated if any other filter options are chosen to restrict the query set
        if not request_dict:
            request_dict.update({
                'product__name': 'ABC Product'
            })
    
        request_dict = kwargs['data']
    
        return kwargs
    

    当没有传递其他选项来限制获取的数据时,现在应该将默认产品设置为“ABC 产品”。

    【讨论】:

    • 能否发表您的看法
    • 这段代码有一些小问题。请参阅我的答案以获取更新版本。
    猜你喜欢
    • 2015-01-14
    • 1970-01-01
    • 1970-01-01
    • 2014-03-17
    • 1970-01-01
    • 2016-08-21
    • 2018-05-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多