django-rest-framework - 等同于" perform_create"在APIView

时间:2014-12-06 22:55:17

标签: django django-rest-framework

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

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

上述内容适用于generics.ListAPIView,但APIView怎么办?我有两个模型ABB有一个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)

如果我在a中加入BSerializer字段,则会抱怨a This field is required。如果我将其排除,则会提供IntegrityError。它应该如何完成?

1 个答案:

答案 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