Python 在配置文件序列化程序中显示名字、姓氏和电子邮件

Python 在配置文件序列化程序中显示名字、姓氏和电子邮件,python,django,django-rest-framework,Python,Django,Django Rest Framework,我有一个配置文件模型,用户注册后必须更新他们的配置文件。为此,我设计了两个序列化程序,一个UserSerializer显示用户列表,另一个ProfileSerializer有很多字段供用户添加到他们的配置文件中。用户不仅可以更新他们的个人资料,如身高、体重、年龄、位置、体型等,还可以更新个人资料中的名字、姓氏和电子邮件 这是我的UserSerializer和ProfileSerializer class ProfileSerializer(serializers.ModelSerializer)

我有一个配置文件模型,用户注册后必须更新他们的配置文件。为此,我设计了两个序列化程序,一个UserSerializer显示用户列表,另一个ProfileSerializer有很多字段供用户添加到他们的配置文件中。用户不仅可以更新他们的个人资料,如身高、体重、年龄、位置、体型等,还可以更新个人资料中的名字、姓氏和电子邮件

这是我的UserSerializer和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',)
我无法显示名字、姓氏和用户名字段,以便用户随个人资料一起更新

您可以看到屏幕截图,没有显示名字、姓氏和用户名


您可以在
档案序列化器中使用
关键字参数在
字符域
中显示
用户名

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

现在,DRF将从配置文件模型上的
用户关系中获取
名字
姓氏
电子邮件

但为什么字段中没有填充屏幕截图中显示的当前值?验证的\u data.pop('first\u name',None)始终没有。我的更新应该在UserSerializer还是ProfileSerializer中?学徒您尚未在ProfileSerializer中声明这些字段,因此它不会显示它们。当您添加用户字段时,它会呈现为选择框,因为它是ForeignKey/OneToOne关系。请尝试我在回答中建议的更改。提交表单时,将呈现字段并更新值。