2016-04-20 23 views
8

Così ho un serializzatore che assomiglia a questoDjango-REST Serializer: Queryset non filtra PrimaryKeyRelatedField risultati

class BuildingsSerializer(serializers.ModelSerializer): 
    masterlisting_set = serializers.PrimaryKeyRelatedField(many=True, 
            queryset=Masterlistings.objects.all()) 

e funziona benissimo

serializer = BuildingsSerializer(Buildings.objects.get(pk=1)) 
serializer.data 

produce

OrderedDict([ 
    ("masterlistings_set", [ 
     "0a06e3d7-87b7-4526-a877-c10f54fa5bc9", 
     "343643ac-681f-4597-b8f5-ff7e5be65eef", 
     "449a3ad2-c76c-4cb8-bb86-1be72fafcf64", 
    ]) 
]) 

ma se cambio il queryset nel serializzatore su

class BuildingsSerializer(serializers.ModelSerializer): 
    masterlistings_set = serializers.PrimaryKeyRelatedField(many=True, queryset=[]) 

Ho ancora lo stesso risultato esatto.

OrderedDict([ 
    ("masterlistings_set", [ 
     "0a06e3d7-87b7-4526-a877-c10f54fa5bc9", 
     "343643ac-681f-4597-b8f5-ff7e5be65eef", 
     "449a3ad2-c76c-4cb8-bb86-1be72fafcf64", 
    ]) 
]) 

Si suppone che ciò accada? Sto usando i queryset in modo errato? Ho usato [] come un semplice esempio per mostrare che non importa ciò che ho inserito non cambia nulla.

Si prega di avere una visione chiara sarebbe preziosa

Va notato che masterlistings ha un rapporto chiave primaria che punta a edifici. Quindi una masterizzazione appartiene a un edificio.

risposta

6

Come rilevato dalla @zymud, argomento queryset in PrimaryKeyRelatedField viene utilizzato per la convalida dell'input campo per la creazione di nuove voci. Un'altra soluzione per filtrare fuori masterlistings_set è quello di utilizzare serializers.SerializerMethodField() come segue:

class BuildingsSerializer(serializers.ModelSerializer): 
    masterlisting_set = serializers.SerializerMethodField() 

    def get_masterlisting_set(self, obj): 
     return MasterListing.objects.filter(building=obj).values_list('pk',flat=True) 
+0

Fantastico, sto accettando questa risposta perché è la più pulita delle due! –

+0

Sei un santo (12:04) – dps

2

queryset nei relativi limiti di campo solo valori accettabili. Quindi con queryset=[] non sarà possibile aggiungere nuovi valori a masterlisting_set o creare nuovi Buildings.

AGGIORNAMENTO. Come usare set di query per il filtraggio

Questo è un po 'complicato bi - è necessario riscrivere il metodo ManyRelatedField e many_init nel vostro RelatedField.

# re-define ManyRelatedField `to_representation` method to filter values 
# based on queryset 
class FilteredManyRelatedField(serializers.ManyRelatedField): 
    def to_representation(self, iterable): 
     iterable = self.child_relation.queryset.filter(
      pk__in=[value.pk for value in iterable]) 
     return super(FilteredManyRelatedField, self).to_representation(iterable) 


# use overridden FilteredManyRelatedField in `many_init` 
class FilteredPrimaryKeyRelatedField(serializers.PrimaryKeyRelatedField): 
    @classmethod 
    def many_init(cls, *args, **kwargs): 
     kwargs['child_relation'] = cls(queryset=kwargs.pop('queryset')) 
     return FilteredManyRelatedField(*args, **kwargs) 
+0

vedo, vi ringrazio per le informazioni. Sai comunque di usarlo per filtrare le informazioni che ricevo dal serializzatore? –

+1

Ho aggiornato la mia risposta. – zymud

+0

Wow! Grazie per il tuo tempo! –

Problemi correlati