2013-09-05 3 views
18

기본적으로 ModelSerializer의 관련 필드에서 비활성 사용자를 필터링하려고합니다. 나는 다음과 같은뿐만 아니라 Dynamically limiting queryset of related field을 시도 :djangorestframework : 관련 필드 필터링

class MySerializer(serializers.ModelSerializer): 
    users = serializers.PrimaryKeyRelatedField(queryset=User.objects.filter(active=True), many=True) 
    class Meta: 
    model = MyModel 
    fields = ('users',) 

이러한 접근 방식의 어느 단지의 검색어를 필터링했다. 필드로 중첩 된 관련 Serializer 클래스에 대해이 작업을 수행하려고합니다 (그러나 해당 필드를 RelatedField와 함께 사용할 수는 없습니다).

중첩 된 관계에 대해 쿼리 세트를 필터링하는 방법은 무엇입니까?

답변

23

나는 더 나은 해결책을보기 위해 호기심이 생길 것이다. 필자는 serializer에서 사용자 지정 메서드를 사용하여이 작업을 수행했습니다. 조금 더 장황하지만 적어도 명백합니다. GarageSerializer 자동차의 중첩 관계를 필터링 할

일부 의사 코드 :

class MyGarageSerializer(...): 
    users = serializers.SerializerMethodField('get_cars') 

    def get_cars(self, garage): 
     cars_queryset = Car.objects.all().filter(Q(garage=garage) | ...).select_related() 
     serializer = CarSerializer(instance=cars_queryset, many=True, context=self.context) 

     return serializer.data 

은 확실히 당신이 원하는대로로의 검색어를 교체합니다. 컨텍스트 (항상 중첩 된 직렬화 기에서 일부 쿼리 매개 변수를 검색하는 데 사용)를 제공 할 필요가 없으며 .select_related (최적화)가 필요하지 않을 수도 있습니다. 내 목적으로

+2

, 지금은 정말 좋은 해결 방법입니다. 그러나, 당신처럼, 더 나은 솔루션이 있는지 궁금 해서요 :) – fangsterr

+3

불행히도이 방법은 읽기 전용 필드에만 작동합니다. 친절한 작성 솔루션을 찾고 있습니다. – dbro

+1

@dbro - 예, 읽기 전용입니다. 그 프로젝트 (2013) 이후 DRF를 사용하지 않았으므로 도움이되지 않습니다. 새로운 질문을하고 싶을 수도 있습니다. –