django-rest-framework - APIView中"perform_create"的等价物

nor*_*tpy 3 django django-rest-framework

我在创建对象时可以在哪里设置关联模型APIView

def perform_create(self, serializer): 
     serializer.save(owner=self.request.user)
Run Code Online (Sandbox Code Playgroud)

上面的工作generics.ListAPIView但是怎么样APIView?我有两个型号AB.B有一个ForeignKeyA.在创建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)
Run Code Online (Sandbox Code Playgroud)

如果我把这个a字段包含在内BSerializer,那就抱怨了a This field is required.如果我将其排除,那么它会给出一个IntegrityError.它应该如何完成?

Kev*_*own 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属性中创建或修改的模型对象的引用.对于a ModelSerializer,这是传入任何更改的模型对象(假设它通过了验证).调用serializer.save只保存此对象(在重建关系时),因此您可以直接修改它.

要设置保存或创建对象时所需的外键关系,您只需要...

serializer.object.related_field = related_object
Run Code Online (Sandbox Code Playgroud)

...在调用之前serializer.save()(没有参数).在Django的REST框架2.4,任何参数传递给serializer.save让他们下来的方式model.save,这就是为什么你不能使用我们推荐的Django的REST框架3.0的方法.在3.0中,serializer.save允许您传递额外的参数,这些参数将直接设置在应该创建的对象上(更好的设置方式serializer.validated_data),而不是传递给它们model.save.