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

ise*_*noe 4 django serialization django-rest-framework

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

#views.py
def create(self, request):
    pass

#serializer.py
def create(self, validated_data):
    return Model.objects.create(**validated_data)
Run Code Online (Sandbox Code Playgroud)

我什么时候应该自定义视图/创建与序列化程序/创建?

Gab*_*Muj 8

create 视图集的方法

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

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

你真的不需要覆盖create视图集上的方法,如果你需要从视图本身发送到序列化程序,你可以覆盖perform_create默认情况下serializer.save()。例如。如果您想从请求中发送用户,您可以执行以下操作:

    def perform_create(self, serializer):
        # here you will send `created_by` in the `validated_data` 
        serializer.save(created_by=self.request.user)
Run Code Online (Sandbox Code Playgroud)

注意:幕后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
Run Code Online (Sandbox Code Playgroud)

所以在这里你要发送一个包含关于Parent对象的数据的有效负载,还有一个items包含它们表示的列表,所以现在该create方法还将创建 Items 并将它们与 Parent 实例链接。

总结一下:

  • 在 viewset 中,create 方法处理请求-响应流
  • 在序列化程序中,create 方法使用经过验证的数据处理模型实例的创建。