在APIView
创建对象时,我可以在哪里设置关联模型?
def perform_create(self, serializer):
serializer.save(owner=self.request.user)
上述内容适用于generics.ListAPIView
,但APIView
怎么办?我有两个模型A
和B
。 B
有一个ForeignKey
到A
。创建B
的实例时如何在保存之前设置ForeignKey
?
a = A.objects.get(id=request.DATA['a_id'])
serializer = BSerializer(data=request.DATA)
if serializer.is_valid():
b = serializer.save(a=a)
如果我在a
中加入BSerializer
字段,则会抱怨a This field is required
。如果我将其排除,则会提供IntegrityError
。它应该如何完成?
答案 0 :(得分:9)
对于Django REST Framework 3.0:
perform_create
可通过泛型API获取,这就是它适用于GenericAPIView
和任何子类(包括ViewSet
个实例)的原因。
您获得的错误是在序列化程序级别上,在您达到serializer.save
之前,因此让perform_create
无法完全帮助您。如果用户永远不会提交对象的完整嵌套表示(并且您的序列化程序期望一个),那么最好的办法是创建字段read_only
并在序列化程序之外处理它,方法是将其传递给serializer.save
方法。
对于Django REST Framework 2.4:
perform_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
...在调用serializer.save()
之前(没有参数)。在Django REST Framework 2.4中,传递给serializer.save
的任何参数都会降低到model.save
,这就是为什么你不能使用Django REST Framework 3.0推荐的方法。在3.0中,serializer.save
允许您传递将直接设置在应该创建的对象上的额外参数(设置serializer.validated_data
的更好方法),而不是将它们传递到model.save
。