首页 > 解决方案 > Django Rest - 序列化器:必须是创建时的实例

问题描述

我正在尝试使用 Django Rest 框架创建一个嵌套的序列化程序。关系是 Profile X User 但是当我使用时Profile.objects.create(user=profile, **user_data)我得到了ValueError: Cannot assign "<Profile: Profile object (7)>": "Profile.user" must be a "User" instance.

这应该是对模型关系定义或序列化程序声明本身的一些新手误解,但我在文档周围找不到任何东西。如果有人能指出我的方向,我会很优雅。

模型.py

class User(models.Model):
    name = models.CharField(max_length=100, blank=False)
    email = models.CharField(max_length=100, blank=True, default='')
    password = models.CharField(max_length=100, blank=True, default='')
    timestamp = models.DateTimeField(default= timezone.now)

    class Meta:
        ordering = ['timestamp']

class Profile(models.Model):

    # choices [...]

    user = models.OneToOneField(User, on_delete=models.CASCADE, null=True)
    profile_type = models.CharField(max_length=2,choices=PROFILE_CHOICES,default=TEAMMEMBER)
    authentication_token  = models.CharField(max_length=100,  null=True)
    avatar_url  = models.CharField(max_length=100, default='')
    permissions = models.CharField(max_length=100, null=True)
    timestamp = models.DateTimeField(default= timezone.now)

    class Meta:
        ordering = ['timestamp']

序列化程序.py

class UserSerlializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = ['name', 'email', 'password']

class ProfileSerializer(serializers.ModelSerializer):
    user = UserSerlializer()

    class Meta:
        model = Profile
        fields = ['user', 'profile_type']

    def create(self, validated_data):
        user_data = validated_data.pop('user')
        profile = Profile.objects.create(**validated_data)
        Profile.objects.create(user=profile, **user_data)
        return Profile

邮政

{   
    "profile_type" : "ST",
      "user": {
        "name" : "test",
        "email" : "test@test.com",
        "password" : "123456"
    }
}

标签: pythondjangodjango-rest-framework

解决方案


您正在以错误的方式创建实例。改变你的create(...)方法,

class ProfileSerializer(serializers.ModelSerializer):
    user = UserSerlializer()

    class Meta:
        model = Profile
        fields = ['user', 'profile_type']

    def create(self, validated_data):
        user_data = validated_data.pop('user')
        user_instance = User.objects.create(**user_data)
        profile_instance = Profile.objects.create(user=user_instance, **validated_data)
        return profile_instance

推荐阅读