我有一个像这样的模型:

class AppUser(models.Model):
    user = models.OneToOneField(User, related_name='app_user')


我有一个此类的序列化器:

class AppUserSerializer(serializers.ModelSerializer):
    first_name = serializers.CharField(source='user.first_name')

    class Meta:
        model = AppUser
        fields = ('first_name',)

def create(self, validated_data):
    first_name = validated_data.pop('first_name')
    user = User.objects.create_user(username='test', first_name=first_name, last_name='test')
    app_user = AppUser.objects.create(**validated_data, user=user)
    return app_user


但是,当我尝试使用此序列化程序创建用户时,尽管我发送了一个名为first_name的参数,但仍收到此错误:


  KeyError:“ first_name”


当我在调试模式下运行程序时,我可以看到validated_data为空!

另一点是,当我将write_only添加到字段中时,它会出现在validated_data中,但是我不希望该字段为write_only

似乎是使该字段为read_only的原因,我该如何更改?

最佳答案

Validated_data不直接包含first_name数据。它包含在嵌套的user词典中。因此,您应该首先在create方法中获取user数据:

def create(self, validated_data):
    user_data = validated_data.pop('user')
    first_name = user_data.pop('first_name')
    user = User.objects.create_user(username='test', first_name=first_name, last_name='test')
    app_user = AppUser.objects.create(**validated_data, user=user)
    return app_user

关于python - 具有源的DRF ModelSerializer CharField未出现在validated_data中,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50444958/

10-11 04:45