Django Rest Framework - 在APIView中,“perform_create”的等效方法是什么?

4

在创建 APIView 对象时,我应该在哪里设置关联的模型?

def perform_create(self, serializer): 
     serializer.save(owner=self.request.user)

以上代码适用于generics.ListAPIView,但是对于APIView呢?我有两个模型ABB有一个指向AForeignKey。当创建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)

如果我在BSerializer中包含a字段,则会出现“a字段是必需的”的错误提示。如果我将其排除,则会出现IntegrityError。应该如何处理?
1个回答

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()中。


使用 serializer.save(myforeignkeyfield=A.Object.get(pk=1) 会出现错误:save() got an unexpected argument...。我希望能够在 save() 中关联相关的模型,但是却得到了这个错误。至少在版本2.4中是这样的。 - Sam R.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接