2017-05-01 3 views
0

Ich habe ein Profilmodell, das nach der Anmeldung des Benutzers sein Profil aktualisieren muss. Dafür habe ich zwei Serializer entworfen, einen UserSerializer, um die Liste der Benutzer anzuzeigen, und einen anderen ProfileSerializer, der viele Felder enthält, die der Benutzer in seinem Profil hinzufügen kann. Der Benutzer kann nicht nur sein Profil wie Höhe, Gewicht, Alter, Ort, Körper_Typ etc. aktualisieren, sondern sollte auch Vorname, Nachname, E-Mail aus dem Profil aktualisieren.Zeige Vorname, Nachname und E-Mail im Profil Serializer

Hier ist meine UserSerializer und ProfileSerializer

class ProfileSerializer(serializers.ModelSerializer): 
    # url = serializers.HyperlinkedRelatedField(source="user", view_name="user_profile") 
    user = serializers.PrimaryKeyRelatedField(read_only=True) 
    token = serializers.PrimaryKeyRelatedField(read_only=True) 

    class Meta: 
     model = Profile 
     fields = ('token', 'user', 'current_location', 'permanent_location', 'dob', 
        'about_me', 'gender_status', 'create_profile_for', 'marital_status', 
        'height', 'weight', 'body_type', 'complexion',) 

    def update(self, instance, validated_data): 
     first_name = validated_data.pop('first_name', None) 
     last_name = validated_data.pop('last_name', None) 
     user_inst_fields = {} 
     if first_name: 
      user_inst_fields['first_name'] = first_name 
     if last_name: 
      user_inst_fields['last_name'] = last_name 
     if user_inst_fields: 
      User.objects.update_or_create(id=instance.user.id, defaults=user_inst_fields) 
     profile, created = Profile.objects.update_or_create(token=instance.token, defaults=validated_data) 
     print('profile', profile, created) 
     return profile 

class UserSerializer(serializers.ModelSerializer): 
    profile = ProfileSerializer(required=True) 
    class Meta: 
     model = User 
     fields = ('id', 'profile', 'username', 'email', 'first_name', 'last_name',) 

ich nicht die Bereiche first_name, last_name und Benutzernamen für die Benutzer sie zusammen mit ihrem Profil zu aktualisieren zeigen konnte.

Sie den Screenshot sehen können, keine first_name, last_name und Benutzername ist

gezeigt

enter image description here

Antwort

1

Sie zeigen die first_name, last_name und username in ProfileSerializer mit source Schlüsselwort-Argument in einer CharField für first_name und last_name und Benutzername .

class ProfileSerializer(serializers.ModelSerializer): 
    # url = serializers.HyperlinkedRelatedField(source="user", view_name="user_profile") 
    user = serializers.PrimaryKeyRelatedField(read_only=True) 
    token = serializers.PrimaryKeyRelatedField(read_only=True) 
    first_name = serializers.CharField(source = "user.first_name") 
    last_name = serializers.CharField(source = "user.last_name") 
    username = serializers.CharField(source = "user.username") 

    class Meta: 
     model = Profile 
     fields = ('token', 'user', 'current_location', 'permanent_location', 'dob', 
        'about_me', 'gender_status', 'create_profile_for', 'marital_status', 
        'height', 'weight', 'body_type', 'complexion',) 

    def update(self, instance, validated_data): 
     first_name = validated_data.pop('first_name', None) 
     last_name = validated_data.pop('last_name', None) 
     user_inst_fields = {} 
     if first_name: 
      user_inst_fields['first_name'] = first_name 
     if last_name: 
      user_inst_fields['last_name'] = last_name 
     if user_inst_fields: 
      User.objects.update_or_create(id=instance.user.id, defaults=user_inst_fields) 
     profile, created = Profile.objects.update_or_create(token=instance.token, defaults=validated_data) 
     print('profile', profile, created) 
     return profile 

Nun wird DRF holen first_name, last_name und email aus der user Beziehung auf dem Profil-Modell.

+0

Aber warum die Felder nicht mit dem aktuellen Wert, den Sie im Screenshot sehen können gefüllt? – Serenity

+0

valided_data.pop ('first_name', None) gibt mir keine die ganze Zeit. – Serenity

+0

sollte mein Update in UserSerializer oder ProfileSerializer sein? – Serenity

Verwandte Themen