2013-09-05 15 views
18

Fondamentalmente, voglio filtrare gli utenti inattivi da un campo correlato di ModelSerializer. Ho provato Dynamically limiting queryset of related field così come la seguente:djangorestframework: filtraggio in un campo correlato

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

Nessuno di questi approcci ha lavorato solo per filtrare il set di query. Voglio farlo per una classe Serializer correlata annidata come un campo (ma non riuscivo nemmeno a farlo funzionare con un RelatedField).

Come faccio a filtrare il queryset per la relazione nidificata?

risposta

23

Sarò curioso di vedere una soluzione migliore. Ho usato un metodo personalizzato nel mio serializzatore per farlo. È un po 'più prolisso ma almeno è esplicito.

Alcuni pseudo codice in cui un GarageSerializer sarebbe filtrare il rapporto nidificato delle auto:

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 

Ovviamente sostituire il set di query con quello che vuoi. Non è sempre necessario fornire il contesto (l'ho usato per recuperare alcuni parametri di query nel serializzatore nidificato) e probabilmente non è necessario il .select_related (che era un'ottimizzazione).

+2

per i miei scopi, questo è un ottimo rimedio per ora. tuttavia, come te, sono curioso di vedere se c'è una soluzione migliore :) – fangsterr

+3

Sfortunatamente questo metodo funziona solo per i campi di sola lettura. Alla ricerca di una soluzione che sia anche amichevole. – dbro

+1

@dbro: sì, è di sola lettura. Non ho usato il DRF da quel progetto (2013), quindi non posso aiutarti. Potresti voler fare una nuova domanda. –

Problemi correlati