Python Django Rest框架&x2B;django_过滤器:如果未提供任何内容,则过滤名称或无
我正在使用Django rest框架和Django_过滤器。 (我已尽可能简化/减少此处的代码) 如果请求中未指定约束,如何强制django_筛选器筛选约束\uu name=None(或constraints=None) 假设我有这个模型:Python Django Rest框架&x2B;django_过滤器:如果未提供任何内容,则过滤名称或无,python,django,django-rest-framework,django-filter,Python,Django,Django Rest Framework,Django Filter,我正在使用Django rest框架和Django_过滤器。 (我已尽可能简化/减少此处的代码) 如果请求中未指定约束,如何强制django_筛选器筛选约束\uu name=None(或constraints=None) 假设我有这个模型: class Resource(models.Model): constraints = models.ManyToManyField(Feature, related_name='constraint+', blank=True) class Fe
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/resource/?constraints=testconstraint工作正常,但我希望/api/resource/只返回没有约束的资源
我可以减少queryset,但感觉django_过滤器可以解决一些问题。是吗
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)
您可以覆盖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)
子类
CharFilter
重写filter
:
class OrNoneCharFilter(CharFilter):
def filter(self, qs, value):
if value is None:
return qs.filter(constraints=None)
return super().filter(qs, value)