【问题标题】:django - returning user extended fields when creating userdjango - 创建用户时返回用户扩展字段
【发布时间】:2015-11-01 21:26:42
【问题描述】:

我正在扩展 auth.user 模型:

Modles.py:

class UserProfile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    phone_number = models.CharField(max_length=15)

这是我的 UserSerializer。

当我创建用户时,我可以更新其userprofile 字段,但我不知道如何将其添加到序列化用户并返回用户字段+扩展字段.

class UserSerializer(serializers.ModelSerializer):

    class Meta:
        model = User
        fields = ('id', 'username', 'first_name', 'last_name', 'password', )
        read_only_fields = ('phone_number', )
        extra_kwargs = {'password': {'write_only': True}}

    def create(self, validated_data):
        user = User(
            first_name=validated_data['first_name'],
            username=validated_data['username'],
            last_name=validated_data['last_name']
        )

        user.set_password(validated_data['password'])
        user.save()
        user.userprofile.phone_number = self.initial_data["phone_number"]
        user.userprofile.save()
        the_dict = {
            'id': user.id,
            'username': user.username,
            'first_name': user.first_name,
            'last_name': user.last_name,
            'phone_number': user.userprofile.phone_number
        }

        return the_dict

如您所见,我试图以某种方式将其添加到字典中,但在我的客户端中,我只获取用户字段('id'、'username'、'first_name'、'last_name')。

如何添加电话号码?

【问题讨论】:

    标签: json django dictionary serialization


    【解决方案1】:

    试试这个:

    class UserSerializer(serializers.ModelSerializer):
    
        # source is required to show where this field is coming from
        phone_number = serializers.CharField(source='userprofile.phone_number')
    
        class Meta:
            model = User
            # Add phone_number to the fields
            fields = ('id', 'username', 'first_name', 'last_name', 'password', 'phone_number', )
            read_only_fields = ('phone_number', )
            extra_kwargs = {'password': {'write_only': True}}    
    

    我把上面的代码注释了解释一下。

    【讨论】:

    • 是的,我在发布问题后才发现。效果很好
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-06
    相关资源
    最近更新 更多