2015-06-04 10 views
7

Sto cercando un modo per ovverride del metodo predefinito .create() di un serializzatore ModelSerializer in Django Rest Framework per gestire un parametro aggiuntivo.Django rest framework: override create() in ModelSerializer passando un parametro aggiuntivo

Nel mio modello Django originale ho appena scavalcato il metodo di default .save() per la gestione di un parametro extra. Ora .save() può essere chiamato anche in questo modo: .save(extra = 'foo').

devo creare una mappatura ModelSerializer su quel modello originale Django:

from OriginalModels.models import OriginalModel 
from rest_framework import serializers 

class OriginalModelSerializer(serializers.ModelSerializer): 

    # model fields 
    class Meta: 
     model = OriginalModel 

Ma in questo modo non posso passare il extra param alla .save() metodo dei modelli.

In che modo è possibile ignorare correttamente il metodo della mia classe per prendere (eventualmente) questo parametro extra?

risposta

12

Hmm. questa potrebbe non essere la risposta perfetta dato che non so come si desidera passare questo "extra" in (cioè è un campo extra in una forma normalmente, ecc.)

Cosa si vorrebbe fare è solo rappresentare foo come un campo sul serializzatore. Allora sarà presente in validated_data in create, allora si può fare create fare qualcosa di simile alla seguente

def create(self, validated_data): 
    obj = OriginalModel.objects.create(**validated_data) 
    obj.save(foo=validated_data['foo']) 
    return obj 

Si sarebbe probabilmente desidera guardare l'implementazione predefinita di creare per alcune delle altre cose che fa anche se (come rimuovere relazioni molti-a-molti, ecc.).

+2

Il problema è che il parametro "extra" non è un campo del mio 'OrginalModel'. Per quanto ne so, non c'è un modo per aggiungere un campo a un 'ModelSerializer' se non si esegue il mapping su qualsiasi campo regolare di' OrginalModel' – floatingpurr

+6

È necessario inserire il campo 'foo' da' validated_data' prima di passarlo al costruttore del modello, quindi questa risposta dovrebbe funzionare. –

Problemi correlati