私は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()