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中是这样。