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?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Danke @levi für die Anfänge einer Antwort, aber leider ist das nicht alles, also ich denke, das ist eine vollständige Antwort.
Ich ursprünglich fragte:
Stellt sich heraus...Ja. Ich war. Die docs sprechen über die neue
Single-step object creation
, von dem ich denke, dass die Serialisierung und das Modell wurde immer eng gekoppelt. Dieser Gedanke war falsch, denn wenn Sie schreiben Sie Ihre eigene benutzerdefinierte serializer, es ist bis zu Ihnen zu tun, das eigentliche Objekt speichern (oder nicht) in der neuenserializer.update()
undserializer.create()
Methoden.Ich auch gefragt:
Obwohl es keine
serializer.object
, die Sie verwenden können, um ziehen Sie das erstellte Objekt aus nach dem Aufrufserializer.is_valid()
, dieserializer.save()
- Methode gibt das Objekt selbst, das in meinem Fall war einfach schön.So, stellt sich heraus, den code zu ändern, war nicht sehr groß. Hier ist mein neuer code, der ist ziemlich zufrieden mit dem DRF-3:
bemerken, dass es keine Rettung der Einspruch der DB in den Serializer. Ich bin gerade beim erstellen oder aktualisieren Sie das Objekt und dann die Rückkehr.
Nun die Ansicht sieht wie folgt aus:
Ich sagte auch in meinem ursprünglichen post:
Diese Aussage war auch falsch, wie gesehen, durch die Tatsache, dass die create-und update-Methoden nicht haben, um etwas sparen zu jedem DB.
Einzige Einschränkung hier ist, dass der code funktionsfähig ist, aber offensichtlich bin ich gerade Umhüllung meinem Kopf, um einige der DRF2.x->3.x ändert, so dass ich tun könnte, dies in einer nicht-DRF-Weg. Wenn also jemand weiß, fühlen Sie bitte sich frei, mir zu sagen, wie Sie es besser machen. 🙂
Ja, Sie können sich das Objekt selbst mit DRF-3. Ihre
update
Methode sollte diese Signaturupdate(self, instance, validated_data)
Ihre serializer sollte etwa so Aussehen: