djangorestframework-bulk==0.2.1

from rest_framework_bulk import BulkSerializerMixin, BulkListSerializer

使用方法

  1. class BaseSerializer(DynamicFieldsModelSerializer,BulkSerializerMixin):
  2. class Meta:
  3. model = model
  4. list_serializer_class = BulkListSerializer
  5. fields = '__all__'
  1. BulkSerializerMixin是需要被继承的,因为drf默认的序列化器的会过滤掉readonly字段,而id字段一般是readonly的,所以要重写这个方法来重新将id字段(或者其他你通过update_lookup_field属性设置的字段)加回数据.
  2. BulkListSerializer主要实现了update方法:
    • 这样前端可以在put/patch方法的body中传入一个列表,列表中是所有更新过的数据.
    • 列表中的每个对象都必须有id属性,如果有的对象没有,那么会抛出一个ValidationError
    • 列表中的每个对象id都必须是在数据库中已经存在的,如果有新的id进来,那么会抛出一个Could not find all objects to update.ValidationError.
  3. 注意这个方法在完成前面的校验之后,仍然是循环每个对象,单独调用update方法,来保证你写在序列化器中的更新逻辑全部会被调用到.相应的,与重写接口并调用queryset.update()方法相比,sql执行次数会大幅增加.