Django REST框架 - 通过JSON的OneToOne关系

时间:2017-10-16 12:43:03

标签: python json django django-rest-framework

我想创建一个允许通过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对象?

提前致谢。

2 个答案:

答案 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