Python Django Rest框架&x2B;django_过滤器:如果未提供任何内容,则过滤名称或无

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

我正在使用Django rest框架和Django_过滤器。 (我已尽可能简化/减少此处的代码)

如果请求中未指定约束,如何强制django_筛选器筛选约束\uu name=None(或constraints=None)

假设我有这个模型:

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)