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)