我有一个序列化程序,可以很好地为我提供一切。
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进行过滤。模型之间没有关系。
进行过滤的最佳方法是什么?
答案 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))