python - 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"
}
}
解决方案
您正在以错误的方式创建实例。改变你的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
推荐阅读
- google-cloud-platform - 从云功能插入扳手的会话泄漏
- sapjco3 - SAPJCo 是特定于 SAP 安装还是可以在不同的 SAP Box 之间重复使用?
- javascript - 为什么第二次迭代后 b 的值会自行增加?
- wordpress - 防止 CMS 识别
- javascript - 检查您是从主页还是子页面重定向的方法
- node-red - 过滤节点红色上的文件尾以执行命令
- java - 为什么 PRESENT 是 HashSet 中 add 方法中 map.put(e,PRESENT) 中的虚拟值?
- daterangepicker - 同时显示预定义的范围选项和日历 (daterangepicker.js)
- ios - 如何在此扩展程序中创建一个按钮,在不使用操作按钮的情况下在主应用程序中打开特定视图?
- swiftui - 如何在 ScrollView 中执行视图的动画转换?