【问题标题】:Django Rest - Serializer: must be a instance on createDjango Rest - 序列化器:必须是创建时的实例
【发布时间】:2020-01-20 05:54:24
【问题描述】:

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

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

models.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']

serializer.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"
    }
}

【问题讨论】:

  • 似乎问题就在这里。 Profile.objects.create(user=profile, **user_data)。您正在将 profile 对象分配给 Profile.user。它必须是 User 对象。

标签: python django django-rest-framework


【解决方案1】:

您正在以错误的方式创建实例。将您的 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

【讨论】:

  • 我正要添加这个答案来保存 1 个查询,但我会保持原样。这是一个更好的答案。
【解决方案2】:

Profile.user 应该是User 实例,但您分配的是Profile 实例。

将您的 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')
        profile = Profile.objects.create(**validated_data)
        user = User.objects.create(**user_data) # 1. creating user
        profile.user = user # 2. assigning user
        profile.save()  # 3. saving profile after adding user
        return profile # returning Profile instance.

【讨论】:

    【解决方案3】:

    也从 django contrib auth 模块继承您的用户模型,并与配置文件建立一对一的关系

    from django.contrib.auth.models import User
    

    【讨论】:

      猜你喜欢
      • 2019-03-21
      • 1970-01-01
      • 1970-01-01
      • 2022-01-19
      • 1970-01-01
      • 2020-05-23
      • 2021-12-15
      • 2015-11-09
      • 1970-01-01
      相关资源
      最近更新 更多