2016-11-18 4 views
0

私はdjango_filtersとともにDjango restフレームワークを使用しています。 (ここではコードをできるだけ単純化しようとしました)Django Rest Framework + django_filter:何も提供されていない場合、名前のフィルタリングまたはなし。

要求に制約が指定されていない場合、django_filtersにconstraints__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) 

そして、このビューとフィルタ:?正常に動作しますtestconstraint

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 /リソース/制約=が、私は/ API /リソースをしたいです/制約を持たないリソースのみを返します。

私はクエリーセットを減らすことができますが、django_filtersが解決できるような感じです。それはあなたがフィルタのクエリを操作し、リクエストオブジェクトにアクセスすることができますフィルタセットサブクラス、上qsプロパティをオーバーライドすることができ

def get_queryset(self): 
    if 'constraints' not in self.request.query_params: 
     return Resource.objects.filter(constraints=None) 
    else: 
     return Resource.objects.all() 

答えて

2

を?:です:

これで試してみてください:

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) 
2

サブクラスCharFilterオーバーライドfilter

class OrNoneCharFilter(CharFilter): 
    def filter(self, qs, value): 
     if value is None: 
      return qs.filter(constraints=None) 

     return super().filter(qs, value) 
関連する問題