我想创建一个允许通过POST请求发送JSON的API。 然后应该将JSON传递给一个序列化器,它负责创建一个新对象并用现有数据填充它。
它适用于简单的'例如基本的字符输入,例如用户名和类似的情况,但在创建OneToOne关系时我很严重。这是示例代码。
employee_list
中的views.py
函数 - data['account']
是一个有效的用户名,成功选择了User
个实例!
data = JSONParser().parse(request)
user_object = User.objects.get(username=data['account'])
data['account'] = user_object # this is now a valid User object
serializer = EmployeeSerializer(data=data)
if serializer.is_valid():
serializer.save()
return JsonResponse(serializer.data, status=201)
return JsonResponse(serializer.errors, status=400)
模型
class Employee(models.Model)
id = models.AutoField(primary_key=True)
name = models.CharField(...)
surname = models.CharField...
account = models.OneToOneField(User)
role = ...
salary = ...
picture = ...
和序列化器
class EmployeeSerializer(serializers.ModelSerializer):
class Meta:
model = Employee
fields = (...) # all fields of the `Employee` model
到目前为止,这么好,序列化器永远不会验证!当我删除对OneToOne关系的需要时,它可以工作..
如何创建一个与User对象具有工作OneToOne关系的新Employee对象?
提前致谢。
答案 0 :(得分:2)
问题是因为用户对象被传递给序列化程序,当它可以传递给序列化程序时,同时保存对象。尝试这样的事情:
data = JSONParser().parse(request)
user_object = User.objects.get(username=data['account'])
serializer = EmployeeSerializer(data=data)
if serializer.is_valid():
# pass object to save, instead of saving in the data dictionary
serializer.save(account=user_object)
return JsonResponse(serializer.data, status=201)
return JsonResponse(serializer.errors, status=400)
答案 1 :(得分:2)
您需要传递pk
对象的User
,而不是User
对象。
<强>解决方案强>:
data['account'] = user_object.pk