1

나는 모든 것을 잘 해주는 시리얼 라이저를 가지고있다.DRF 시리얼 필터 필터링

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

모델과의 관계는 무엇입니까? 당신이 그것을 보여줄 수 있습니까, 어쩌면 [출처] (http://www.django-rest-framework.org/api-guide/fields/#source)가 당신을 도울 수 있습니다. –

+0

죄송합니다. 두 모델 사이에는 아무 관계가 없습니다. 내 질문이 업데이트되었습니다. 이미 설명서를 확인했지만 대답을 찾을 수 없습니다. – digode

+1

코드 샘플을 제공했지만 시도/수행하려는 내용이 명확하지 않습니다. 특히 serializer에서 필터링하는 이유는 무엇입니까? 필터링은 일반적으로보기의 데이터 세트에 적용됩니다. 왜 다른 경우입니까? – Linovia

답변

1

ModelA의 개체가 ModelB의 개체와 같은 것으로 보입니다. 이 경우 하위 쿼리를 사용하여 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)) 

은 위의 필터를 장고 것입니다, 당신은 필터에 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))