Django的REST框架+ django_filter:过滤器名或无,如果没有提供
问题描述:
我使用Django的REST框架与django_filters在一起。 (我尽量简化/尽可能减少代码)Django的REST框架+ django_filter:过滤器名或无,如果没有提供
如果在请求中未指定约束,如何强制django_filters过滤约束_name =无(或约束=无)?
比方说,我有这样的模式:
class Resource(models.Model):
constraints = models.ManyToManyField(Feature, related_name='constraint+', blank=True)
class Feature(models.Model):
name = models.CharField(max_length=255, blank=False, unique=True)
这种观点和过滤:
class ResourceFilter(FilterSet):
constraints = django_filters.CharFilter(name='constraints__name')
class Meta:
model = Resource
fields = ['constraints']
class ResourceViewSet(viewsets.ModelViewSet):
serializer_class = ResourceSerializer
filter_class = ResourceFilter
filter_backends = (filters.DjangoFilterBackend,)
/API /资源/约束= testconstraint工作正常,但我想/ API /资源/只返回没有约束的资源。
我可以减少查询集,但感觉像什么django_filters可以解决。是不是?:
def get_queryset(self):
if 'constraints' not in self.request.query_params:
return Resource.objects.filter(constraints=None)
else:
return Resource.objects.all()
答
您可以覆盖在FilterSet子类,在那里你可以操纵过滤查询和访问请求对象的属性qs
:
试试这个:
class ResourceFilter(FilterSet):
constraints = django_filters.CharFilter(name='constraints__name')
class Meta:
model = Resource
fields = ['constraints']
@property
def qs(self):
parent_qs = super(ResourceFilter, self).qs
if 'constraints' in self.request.query_params:
return parent_qs
else:
return parent_qs.filter(constraints=None)
答
子类CharFilter
覆盖filter
:
class OrNoneCharFilter(CharFilter):
def filter(self, qs, value):
if value is None:
return qs.filter(constraints=None)
return super().filter(qs, value)