是否有可能使django_filters.AllValuesFilter具有受给定查询集约束的选择

问题描述 投票:0回答:1

我有一个像这样的模型:

class Worker(models.Model):
  city = models.CharField(max_length=50)

以下过滤器:

class CityFilter(django_filters.AllValuesFilter):

    @property
    def field(self):
        f = super(WorkerFilter, self).field
        f.choices = [('', '--------')] +  [(a.pk, a.city) for a in Worker.objects.all()]
        return f


class WorkerFilter(django_filters.FilterSet):
  city = ActuallyAllValuesFilter()
  class Meta:
    model = Worker
    fields = ['city']

我想创建一个所有值过滤器,但选择受限于给定的查询集而不是所有可能的值。我的意思是,我正在寻找类似的东西:

class CityFilter(django_filters.AllValuesFilter):

    @property
    def field(self, qs):
        f = super(WorkerFilter, self).field
        f.choices = [('', '--------')] +  [(a.pk, a.city) for a in qs]
        return f

有办法做到这一点吗?

django django-filter
1个回答
1
投票

目前尚不清楚您期望使用哪种查询集,但我可以看到两种可能性:

1. Use the initial queryset provided to the filterset.

class CityFilter(django_filters.ChoiceFilter):

    @property
    def field(self):
        self.extra['choices'] = [(a.city, a.city) for a in self.parent.queryset]
        return super(CityFilter, self).field

class WorkerFilter(django_filters.FilterSet):
    city = CityFilter(field_name='city')

    class Meta:
        model = Worker
        fields = ['city']

请注意,过滤器在实例化过滤器后,可以访问其parent过滤器。 self.parent.queryset是提供给filterset的初始查询集。

此外,在这种情况下,没有必要使用AllValuesFilter,因为您放弃了它产生的选择。继承自ChoiceFilter

2. Provide a queryset to the filter instance.

class CityFilter(django_filters.ChoiceFilter):

    def __init__(self, *args, queryset, **kwargs):
        workers = kwargs.pop('workers', None)

        kwargs['choices'] = [(a.city, a.city) for a in workers]
        super(CityFilter, self).__init__(*args, **kwargs)

class WorkerFilter(django_filters.FilterSet):
    city = CityFilter(field_name='city', workers=Worker.objects.filter(...))

    class Meta:
        model = Worker
        fields = ['city']
© www.soinside.com 2019 - 2024. All rights reserved.