2015-10-07 27 views
6

Questo è il mio modello:DjangoRestFramework - Omettere campi nulli durante la serializzazione di oggetti

class Post(models.Model): 
    user = models.ForeignKey(User) 
    post = models.CharField(max_length=400) 
    country = models.ForeignKey(Country, blank=True, null=True) 

e questo è il mio serializer:

class PostSerializer(serializers.ModelSerializer): 

    class Meta: 
     model = Post 
     fields = ('user', 'post', 'country',) 

    def create(self, validated_data): 
     post = Post(
       user = User.objects.get(username='MyUser'), 
       post = validated_data['post'], 
     ) 

     if validated_data.get('country', None): 
      post.country = validated_data['country'] 

     return post 

C'è un modo per me dire DRF che se il valore di il campo è nullo (perché il campo 'Paese' è facoltativo e talvolta non è fornito) quindi per saltare e semplicemente serializzare gli altri dati? O almeno serializzarlo con un valore di None?

Non penso di poter utilizzare SerializerMethodField (http://www.django-rest-framework.org/api-guide/fields/#serializermethodfield) perché il campo "Paese" non è un campo di sola lettura (anch'io lo scrivo, se fornito).

Fondamentalmente voglio omettere il campo (o almeno rendere il valore None) durante la serializzazione di un oggetto Se il campo è nullo.

risposta

3

Come di DRF 3.2.4, a condizione che si aggiunge

blank=True 

al campo modelli in questo modo:

class Post(models.Model): 
    country = models.ForeignKey(Country, blank=True) 

poi DRF tratterà il campo come optional durante la serializzazione e deserializzazione esso (si noti però che se non c'è nulla = true sul campo del modello, quindi Django genererà un errore se si tenta di s avere un oggetto nel database senza fornire il campo).

vedere la risposta qui per maggiori informazioni: DjangoRestFramework - correct way to add "required = false" to a ModelSerializer field?

Se si utilizza pre-DRF 3.2.4, allora si può ignorare il campo nel serializzatore e aggiungere required = False ad esso. Vedere la documentazione qui per maggiori informazioni su come specificare o sovrascrivendo campi esplicitamente dichiara: http://www.django-rest-framework.org/api-guide/serializers/#specifying-fields-explicitly

Quindi qualcosa di simile (Si noti che non ho la prova pienamente il codice qui sotto ma dovrebbe essere qualcosa in questo senso):

class PostSerializer(serializers.ModelSerializer): 
    country = serializers.PrimaryKeyRelatedField(required=False) 
    class Meta: 
     model = Post 
     fields = ('user', 'post', 'country',) 
2

Questo thread può essere utile:

https://stackoverflow.com/a/28870066/4698253

E 'in pratica dice che è possibile ignorare la funzione to_representation() con una lieve modifica.

avrei messo questo nei commenti, ma non ho ancora abbastanza punti :(

Problemi correlati