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))
我有一个序列化器,可以让我一切正常。
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))