1

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:

  1. erstellen den Benutzer
  2. ein Konto Objekt parallel
  3. lo erstellen gin das Benutzer
  4. 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 

Antwort

1

Verwendung dieses:

class UserRegistrationSerializer(serializers.ModelSerializer): 
    email = serializers.EmailField(write_only=True) 
    # some other fields 
    password = serializers.CharField(
           style={'input_type': 'password'}, 
           write_only=True, 
           validators=settings.get('PASSWORD_VALIDATORS') 
           ) 
    # make sure you have related_name='account' in your one to one field 
    account = AccountSerializer(read_only=True) 
    # the token field 
    auth_token = TokenSerializer(read_only=True) 

    class Meta: 
     model = User 
     # define fields based on your needs 
     fields = ... 

    def create(self, validated_data): 
     user = User(email=self.validated_data['email']) 
     user.set_password(self.validated_data['password']) 
     user.save() 
     # create account 
     account = Account(user=user) 
     # create token for user 
     token = Token.objects.update_or_create(user=user) 
     return user 

Sie auch eine update Methode benötigen, basierend auf erstellen Ihre individuellen Bedürfnisse.

+0

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

+0

@JimmyVanBraun für das Sie ein Methodenfeld verwenden können. Schauen Sie sich http://www.django-rest-framework.org/api-guide/fields/#serializermethodfield an –

Verwandte Themen