Django Rest Framework 3 Serialisierungsprogramme auf nicht-Model-Objekte?

mache ich ein upgrade auf DRF3.1.1 von 2.4. Ich war mit eine benutzerdefinierte serializer erstellen einer Instanz eines Objekts, das nicht ein Modell.

In 2.4, es war einfach genug, um dies zu tun, weil Sie in den serializer, ich würde das Objekt in restore_object(). In der Ansicht, ich würde Sie anrufen serializer.is_valid() und dann pop die Instanz des Objekts aus der serializer mit serializer.object. Dann konnte ich tun, was ich will.

Mit der 3.x ändert, ist es schwieriger zu get die Instanz aus dem Objekt, da die create-und update-Methoden zu tun, die speichern, und "serializer.Objekt" steht nicht mehr zur Verfügung.

Als ein Beispiel, früher habe ich diese für meine "UserRegistration" - Objekt. Das ist kein Modell, weil es ein Komfort-Objekt, das der server analysiert und speichert die Daten in einer Reihe von anderen Gegenständen/db-Tabellen.

class UserRegistration(object):
    def __init__(self, full_name, stage_name, password="", email="", locale="en_US"):
        self.full_name = full_name
        self.password = password
        self.locale = locale
        self.email = email
        self.stage_name = stage_name

Hier ist der Zusammenhang DRF-2.4 serializer:

class UserRegistrationSerializer(serializers.Serializer):
    full_name = serializers.CharField(max_length=128, required=False)
    stage_name = serializers.CharField(max_length=128)
    password = serializers.CharField(max_length=128, required=False)
    locale = serializers.CharField(max_length=10, required=False)
    # use CharField instead of EmailField for email. We do our own validation later to make for a better error msg.
    email = serializers.CharField(max_length=254, required=False)

    def restore_object(self, attrs, instance=None):
        if instance is not None:
            instance.full_name = attrs.get('full_name', instance.full_name)
            instance.password = attrs.get('password', instance.password)
            instance.locale = attrs.get('locale', instance.locale)
            instance.email = attrs.get('email', instance.email)
            instance.stage_name = attrs.get('stage_name', instance.stage_name)
            return instance
        return UserRegistration(**attrs)

Dann in meinem Blick, als ich etwas wie das hier tun:

class UserRegistration(APIView):
    throttle_classes = ()
    serializer_class = UserRegistrationSerializer

    def post(self, request, format=None):
        event_type = "user_registration"
        serializer = UserRegistrationSerializer(data=request.DATA, context={'request': request})
        try:
            if serializer.is_valid():
            user_registration = serializer.object
            # save user_registration pieces in various places...

Jedoch in DRF3, ich serializer.object ist Weg. Die docs sagen, zu tun "Validierung" mit serializer.validated_data, aber das ist nur ein hash und nicht das Reale Objekt. Gibt es einen Weg, um das Objekt?

Die ganze Sache scheint mehr heiraten, um DB-Objekte, die in diesem speziellen Fall ist genau das, was ich versuche zu vermeiden.

Bin ich einfach nur fehlen einige neue DRF3 Konzept?

Schreibe einen Kommentar