django rest框架-什么是“;执行“创建”;在阿皮维尤
在django rest框架-什么是“;执行“创建”;在阿皮维尤,django,django-rest-framework,Django,Django Rest Framework,在APIView中创建对象时,在哪里可以设置关联的模型 def perform_create(self, serializer): serializer.save(owner=self.request.user) 上述方法在泛型中有效。ListAPIView但是APIView呢?我有两种型号A和BB有一个外键到a。创建B的实例时,如何在保存前设置外键 a = A.objects.get(id=request.DATA['a_id']) serializer = BSerialize
APIView
中创建对象时,在哪里可以设置关联的模型
def perform_create(self, serializer):
serializer.save(owner=self.request.user)
上述方法在泛型中有效。ListAPIView
但是APIView
呢?我有两种型号A
和B
<代码>B有一个外键
到a
。创建B
的实例时,如何在保存前设置外键
a = A.objects.get(id=request.DATA['a_id'])
serializer = BSerializer(data=request.DATA)
if serializer.is_valid():
b = serializer.save(a=a)
如果我在
b序列化器
中包含a
字段,则会抱怨a此字段是必需的
。如果我排除它,那么它会给出一个IntegrityError
。应该怎么做?对于Django REST Framework 3.0:
perform\u create
可通过泛型API获得,这就是为什么它适用于GenericAPIView
和任何子类(包括ViewSet
实例)
您遇到的错误是在序列化程序级别上,甚至在您到达序列化程序.save
之前,因此让执行\u create
不会完全帮助您。如果用户永远不会提交对象的完整嵌套表示(您的序列化程序需要一个),那么最好将字段设为只读
,并通过将其传递到序列化程序。save
方法在序列化程序之外处理它
对于Django REST框架2.4:
perform\u create
是Django REST Framework 3.0中的新版本,因此当前文档与您使用的版本不匹配。如果您可以升级到Django REST Framework 3.0,建议您这样做
在Django REST Framework 2.4中,序列化程序包含对正在serializer.object
属性中创建或修改的模型对象的引用。对于ModelSerializer
,这是包含传入的任何更改的模型对象(假设已通过验证)。调用serializer.save
仅保存此对象(重建关系时),因此您可以直接修改它
要设置保存或创建对象时所需的外键关系,只需执行以下操作
serializer.object.related_field = related_object
…然后调用序列化程序.save()
(不带参数)。在Django REST Framework 2.4中,传递给serializer.save
的任何参数都会向下传递到model.save
,这就是为什么不能使用Django REST Framework 3.0推荐的方法。在3.0中,serializer.save
允许您传递将直接在应创建的对象上设置的额外参数(设置serializer.validated\u数据的更好方法),而不是使用serializer.save(myforeignkeyfield=a.object.get(pk=1)将它们传递到model.save
)
给了我这个错误:save()得到了一个意外的参数…
。我很想将相关模型与save()关联,但这就是我得到的。至少在版本2.4中是这样。