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?我有两个型号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)
Run Code Online (Sandbox Code Playgroud)
如果我把这个a字段包含在内BSerializer,那就抱怨了a This field is required.如果我将其排除,那么它会给出一个IntegrityError.它应该如何完成?
对于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.
| 归档时间: |
|
| 查看次数: |
5432 次 |
| 最近记录: |