视图集或序列化器中的DRF创建方法

时间:2020-08-28 08:56:14

标签: django django-rest-framework serialization

在DRF视图集中自定义“创建”方法或在序列化程序中自定义方法有什么区别?我了解串行器负责反序列化数据,即在POST查询中呈现数据的方式;但是,我也可以在序列化程序的相关字段中创建对象。

index.js?1dce:614 Uncaught (in promise) TypeError: Cannot read property 'super' of undefined

何时应该自定义视图/创建与序列化器/创建?

1 个答案:

答案 0 :(得分:2)

视图集中的

create方法

此方法处理视图中的POST请求逻辑,默认情况下会这样做:

  • 使用请求中的有效负载数据来实例化序列化器
  • 在序列化程序上执行了is_valid方法
  • 通过在序列化程序上调用.save()方法来执行实际创建
  • 返回具有序列化数据和201状态的视图Response

您实际上并不需要在视图集上覆盖create方法,如果您需要从视图本身将其发送给序列化程序,则可以覆盖perform_create,默认情况下会覆盖{{ 1}}。例如。如果您想从请求中发送用户,则可以执行以下操作:

serializer.save()

注意:在后台 def perform_create(self, serializer): # here you will send `created_by` in the `validated_data` serializer.save(created_by=self.request.user) 方法将在save序列化程序上执行create方法

序列化器的

validated_data方法

此方法仅使用create创建实际的模型实例。如果需要创建相关对象,则可以重写此方法,如下所示:

validated_data

因此,您在此处发送的有效载荷不仅包含与 def create(self, validated_data): items_data = validated_data.pop('items') # similar to Parent.objects.create(**validated_data) parent = super().create(**validated_data) for item_data in items_data: Item.objects.create(parent=parent, **item_data) return parent 对象有关的数据,而且还包含Parent及其代表的列表,因此现在items方法还将创建Items和链接它们与Parent实例。

总结一下:

  • 在视图集中,create方法处理请求-响应流
  • 在序列化器中,create方法使用经过验证的数据来处理模型实例的创建。
相关问题