2013-09-05 8 views
18

Zasadniczo chcę odfiltrować nieaktywnych użytkowników z pokrewnego pola ModelSerializer. Próbowałem Dynamically limiting queryset of related field jak następuje:djangorestframework: Filtrowanie w pokrewnym polu

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

Żadne z tych podejść pracował tylko filtrowanie queryset. Chcę to zrobić dla zagnieżdżonej pokrewnej klasy Serializer jako pola (ale nie może nawet uzyskać go do pracy z RelatedField).

Jak filtrować zestaw zapytań dla relacji zagnieżdżonej?

Odpowiedz

23

Będę ciekawy, jak znaleźć lepsze rozwiązanie. W tym celu użyłem niestandardowej metody w moim serializatorze. Jest trochę bardziej gadatliwy, ale przynajmniej jest wyraźny.

Niektóre pseudokod gdzie GarageSerializer byłoby filtrowanie zagnieżdżonych relacji samochodów:

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 

Oczywiście zastąpić queryset z tym, co chcesz. Nie zawsze trzeba podać kontekst (użyłem go do pobrania niektórych parametrów zapytania w zagnieżdżonym serializatorze) i prawdopodobnie nie potrzebujesz .select_related (to była optymalizacja).

+2

dla moich celów, to jest naprawdę dobre obejście na teraz. jednak tak jak Ty, jestem ciekawy, czy istnieje lepsze rozwiązanie :) – fangsterr

+3

Niestety ta metoda działa tylko dla pól tylko do odczytu. Poszukuje również rozwiązania przyjaznego dla zapisu. – dbro

+1

@dbro - tak, to tylko do odczytu. Nie używałem DRF od czasu tego projektu (2013), więc nie mogę pomóc. Możesz zadać nowe pytanie. –