Django的REST框架 - 通过JSON

问题描述:

我想创建一个API,允许通过POST请求发送JSON OneToOne关系。然后 的JSON应该得到转嫁到串行这需要创建一个新的对象,并与现有的数据来填充它的照顾。Django的REST框架 - 通过JSON

它适用于'简单'的情况,比如像用户名和类似的基本字符输入,但我在创建OneToOne关系时遇到了严重的困难。这里是示例代码。

函数employee_listviews.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关系,它的工作原理..

我怎样才能创建一个工作OneToOne关系到用户对象的新Employee对象?

在此先感谢。

+0

什么是验证错误?你可以在里面通过raise_exception:is_valid(raise_exception = TRUE) – arjun27

+0

谢谢你的提示,甚至不知道这是可能的。它给了我确切的错误,因为这个,我能够独自解决它。非常感谢! – fweidemann14

您需要通过User对象的pk,而不是User对象。

解决方案

data['account'] = user_object.pk 
+0

是的,已经做过了。完美的作品。 – fweidemann14

的问题是因为用户对象被传递到串行化器,当它可刚刚通过串行化器,同时节省的对象。尝试是这样的:

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) 
+0

是的,试过为好,然后我看到了,我可以只使用主键来代替,这是比较容易的方式。无论如何Upvoted,也许这是帮助别人。 ;) – fweidemann14