2015-06-04 13 views
7

Poszukuję sposobu właściwego przesłonięcia domyślnej metody .create() serializatora ModelSerializer w Django Rest Framework, aby poradzić sobie z dodatkowym parametrem.Django reszta ramy: nadpisuj create() w ModelSerializer przekazując dodatkowy parametr

W moim oryginalnym modelu Django właśnie przesłoniłem domyślną metodę zarządzania paramem 0123C. Teraz .save() można wywołać także w ten sposób: .save(extra = 'foo').

muszę stworzyć ModelSerializer mapowanie na tym oryginalnym modelu Django:

from OriginalModels.models import OriginalModel 
from rest_framework import serializers 

class OriginalModelSerializer(serializers.ModelSerializer): 

    # model fields 
    class Meta: 
     model = OriginalModel 

Ale w ten sposób nie mogę przejść extra param do modelu .save() metody.

Jak mogę poprawnie przesłonić metodę .create() mojej klasy OriginalModelSerializer, aby uwzględnić (ostatecznie) ten param extra?

Odpowiedz

12

Hmm. to może nie być idealna odpowiedź, ponieważ nie wiem, w jaki sposób chcesz przekazać to "dodatkowe" (tj. czy jest to dodatkowe pole w zwykłej formie, itd.)

Co prawdopodobnie chcesz zrobić jest po prostu reprezentować foo jako pole serializera. Wtedy będzie obecny w validated_data w create, wówczas można dokonać create zrobić coś jak na poniższym

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

że prawdopodobnie chcesz patrzeć na realizację domyślnej stworzyć dla niektórych innych rzeczy robi chociaż (jak usunąć wiele do wielu relacji itp.).

+2

Problem polega na tym, że "dodatkowy" parametr nie jest polem mojego 'OrginalModel'. O ile mi wiadomo, nie ma sposobu na dodanie pola do "ModelSerializer", jeśli nie mapuje on do żadnego zwykłego pola 'OrginalModel' – floatingpurr

+6

Musisz pop przed polem' foo' z 'validated_data' przed przekazaniem go do konstruktora modelu, wtedy ta odpowiedź powinna zadziałać. –

Powiązane problemy