DRF序列化器过滤

时间:2017-10-05 09:37:41

标签: django django-rest-framework django-filter django-filters

我有一个序列化程序,可以很好地为我提供一切。

ModelClassASerializer((serializers.ModelSerializer)):
   .....

   status = serializers.SerializerMethodField()


   def get_status(self, obj):
       ....
       status = ModelB.objects.get(id=obj.id).status
       ....
       return status

   class Meta:
       model = ModelClassA
       fields = (...)

但如果我想根据该状态进行过滤,我不能。我正在使用django_filters.rest_framework.FilterSet进行过滤。模型之间没有关系。

进行过滤的最佳方法是什么?

1 个答案:

答案 0 :(得分:1)

ModelA中的对象看起来与ModelB中的对象具有相同的ID。如果是这种情况,您可以使用子查询来匹配ID。如果ID彼此不对应,则此查询将是无意义的。您想要创建以下查询集:

from django.db.models import Subquery
from myapp.models import ModelA, ModelB

pks = ModelB.objects.filter(status='foo').values('pk')
ModelA.objects.filter(pk__in=Subquery(pks))

要创建上面的django-filter,你需要在过滤器上使用method参数。

from django_filters import rest_framework as filters

class ModelAFilter(filters.FilterSet):
    status = filters.ChoiceFilter(choices=(('foo', 'Foo'), ...), method='filter_status')

    class Meta:
        model = ModelA
        fields = []

    def filter_status(self, queryset, name, value):
        pks = ModelB.objects.filter(status=value).values('pk')
        return queryset.filter(pk__in=Subquery(pks))