用于用户创建的 DRF 序列化器嵌套字段

cod*_*gle 2 django django-models django-authentication django-serializer django-rest-framework

所以我有一个自定义模型 - Profile,它与 django User 对象具有 OneToOne 关系。

class Profile(models.Model):
    user = OneToOneField(User, on_delete=models.CASCADE)
    profile_type = models.CharField()
Run Code Online (Sandbox Code Playgroud)

我想制作一个 django rest 框架序列化程序,它允许创建和检索用户对象的嵌套属性以及“profile_type”属性。

我希望在 POST 请求中指定的名称就像“用户名”、“密码”、“电子邮件”等一样 - 而不是“profile_username”、“profile_password”……

到目前为止我有

class ProfileSerializer(serializers.ModelSerializer):
    username = serializers.CharField(source='profile_user_username')
    password = serializers.CharField(source='profile_user_password')
    email = serializers.CharField(source='profile_user_email')

    class Meta:
        model = Profile
        fields = ('id',
                  'profile_user_username', 'profile_user_password', 'profile_user_email',
                  'username',
                  'password',
                  'email')
        depth = 2
Run Code Online (Sandbox Code Playgroud)

但是 - 我遇到了一个错误:

ImproperlyConfigured: Field name 'profile_user_username' is not valid for model 'Profile'
Run Code Online (Sandbox Code Playgroud)

我是否得到了嵌套字段的语法错误?或者是别的什么?

blu*_*oro 5

尝试:

class User(models.Model):
    username = models.CharField()
    password = models.CharField()
    email = models.CharField()

class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User

class ProfileSerializer(serializers.ModelSerializer):
    user = UserSerializer(many=True)
    class Meta:
        model = Profile
        fields = ('user', 'profile_type',)

    def create(self, validated_data):
        user_data = validated_data.pop('user')
        user = User.objects.create(**user_data)
        profile = Profile.objects.create(user=user, **validated_data)
        return profile
Run Code Online (Sandbox Code Playgroud)

并检查了 为可写嵌套的序列化。

处理嵌套对象:检查这个