Ich bin neu in Django und DRF, aber ich versuche DRFs Serializer zu verwenden, um djosers voreingestelltes Benutzerregistrierungsverhalten zu überschreiben.Django REST Framework Serializer Ausgabe
(Reset usw. djoser für die Benutzerregistrierung/Login/Passwort ein DRF lib =) Ich Djosers sehen habe, das verwendet einen Serializer erstellen Benutzerobjekte
def perform_create(self, serializer): user = serializer.save()
Meine Idee war, diese zu überschreiben Serialisierer zu erreichen folgenden:
- erstellen den Benutzer
- ein Konto Objekt parallel
- lo erstellen gin das Benutzer
- Rückkehr des Kontoobjekt neben den Auth-Token in einer Antwort
Der letzte Punkt gibt mir Mühe, weil ich weiß nicht, wie ein solche individuellen Verhalten in dem Serializer zu erreichen. Ich habe die Eingabefelder schreibgeschützt gemacht, daher sind sie in meiner Antwort nicht enthalten. In der save
Methode erstellen Sie ein Benutzer + Konto-Objekt, den Benutzer anmelden und dann den Benutzer (der von der Ansicht benötigt wird) zurück
Wie serialisieren nur das Konto erstellt Objekt mit dem erstellten Token-String in eine Antwort?
Das ist mein Serializer (vereinfacht und von ein paar Sachen ausgezogen, aber das ist es im Grunde genommen)
class UserRegistrationSerializer(serializers.Serializer):
email = serializers.EmailField(write_only=True)
# some other fields
password = serializers.CharField(style={'input_type': 'password'},
write_only=True,
validators=settings.get('PASSWORD_VALIDATORS')
)
# this should be the output
account = Account(read_only=True)
def save(self):
user = User(email=self.validated_data['email'])
user.set_password(self.validated_data['password'])
user.save()
account = Account(user=user)
token = #logging in my user
return user
Süße, das hat den Trick! Dies funktioniert jedoch nur, weil das Benutzermodell sowohl auf das Account-Modell als auch auf das Token-Modell verweist. Nur für die Zukunft, wie würde man etwas völlig Benutzer unrelated in die Antwort serialisieren? – JimmyVanBraun
@JimmyVanBraun für das Sie ein Methodenfeld verwenden können. Schauen Sie sich http://www.django-rest-framework.org/api-guide/fields/#serializermethodfield an –