我有一个像这样的模型:
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
有办法做到这一点吗?
目前尚不清楚您期望使用哪种查询集,但我可以看到两种可能性:
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
。
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']