【问题标题】:Django REST Framework - OneToOne Relation through JSONDjango REST Framework - 通过 JSON 的 OneToOne 关系
【发布时间】:2018-03-27 23:50:21
【问题描述】:

我想创建一个允许通过 POST 请求发送 JSON 的 API。 然后 JSON 应该被传递给一个序列化程序,该序列化程序负责创建一个新对象并用现有数据填充它。

它适用于“简单”的情况,例如基本的纯字符输入,如用户名等,但在创建 OneToOne 关系时我被严重卡住了。这是示例代码。

views.py 中名为 employee_list 的函数 - 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 对象?

提前致谢。

【问题讨论】:

  • 什么是验证错误?你可以在里面传递 raise_exception:is_valid(raise_exception=True)
  • 感谢您的提示,甚至不知道这是可能的。它给了我确切的错误,因此我能够独自解决它。非常感谢!

标签: python json django django-rest-framework


【解决方案1】:

您需要传递User 对象的pk,而不是User 对象。

解决方案

data['account'] = user_object.pk

【讨论】:

    【解决方案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)
    

    【讨论】:

    • 是的,我也试过了,然后我发现我可以只使用主键,这更容易。无论如何都赞成,也许这对其他人有帮助。 ;)
    猜你喜欢
    • 2015-03-04
    • 2013-09-02
    • 2012-12-11
    • 2012-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-19
    • 2015-12-13
    相关资源
    最近更新 更多