DRF 串行器过滤

DRF serializer filtering

我有一个序列化器,可以让我一切正常。

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 进行过滤。模型之间没有关系。

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

看起来 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))