【问题标题】:bulk_create using ListCreateAPIView and ListSerializerbulk_create 使用 ListCreateAPIView 和 ListSerializer
【发布时间】:2021-09-07 00:07:56
【问题描述】:

以上两种方法有什么区别?

我不明白它们是如何工作的,我确实尝试过谷歌搜索、文档、StackOverflow、中等文章,但我不明白它们的工作原理。

ListCreateAPIView 是否命中了 create 方法作为列表的长度?如何覆盖它? ListSerializer,我根本不明白。所以我必须有一个父列表序列化器和子模型序列化器。

在每个方法中我应该在哪里添加验证?如果我想覆盖字段或保存额外信息怎么办。

基本上,我正在尝试为批量创建用户创建 API 端点。这意味着除了验证之外,我还需要为在后端创建的每个用户设置密码。我该如何保存它?

当我尝试使用 ListCreateAPIView 时,它一直向我抛出错误 ListSerializer is not iterable 即使我设置了 many = True。

ListCreateAPI 仅适用于模型序列化程序还是我需要将类设置为 ListSerializer 类?

而且,当我关注这篇关于使用 ListSerializer 批量创建的中型文章时,它一直告诉我类似“JSON 解析错误 - 期待 ',' 分隔符:第 4 行第 20 列(字符 72)”之类的信息

我真的不明白 ListSerializer 和 ListCreateAPIView 的工作原理。

任何帮助将不胜感激。我是这个其余 API 的新手。谢谢。

我的代码只是基本的

serializers.py

class BulkCreateUsersListSerializer(serializers.ListSerializer):
    def create(self, validated_data):
        users = [UserModel(**item) for item in validated_data]
        return UserModel.objects.bulk_create(users)

class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = ...
        fields = ...
        list_serializer_class = BulkCreateUserListSerializers #commented when I tried using the ListCreateAPIView

views.py

class CreateBulkUsersAPIView(ListCreateAPIView):
    serializer_class = UserSerializer
    queryset = UserModel.objects.all()

    def get_serializer(self, *args, **kwargs):
        """ if an array is passed, set serializer to many """
        if isinstance(kwargs.get('data', {}), list):
            kwargs['many'] = True
        return super(CreateBulkUsersAPIView, self).get_serializer(*args, **kwargs)

----编辑 1---- “ListSerializer 对象不可迭代”的回溯

Template error:
In template C:\Users\Documents\Django Projects\startup\env\lib\site-packages\rest_framework\templates\rest_framework\horizontal\form.html, error at line 2
   'ListSerializer' object is not iterable
   1 : {% load rest_framework %}
   2 :  {% for field in form %} 
   3 :   {% if not field.read_only %}
   4 :     {% render_field field style=style %}
   5 :   {% endif %}
   6 : {% endfor %}

【问题讨论】:

  • 你到底是怎么得到ListSerializer is not iterable even after I set many = True.

标签: django django-rest-framework django-views


【解决方案1】:

你有很多问题,所以我会选择一个可能会解决你大部分问题的问题:

ListCreateApiView 用于通过getlist 对象添加功能,通过post 向您的视图添加create 对象。

ListCreateApiView 的命名并不意味着您可以使用列表创建对象(尽管混淆是可以理解的)。你仍然可以支持它,但你需要在视图中编写自己的 .create() 方法,如下所示:

class CreateBulkUsersAPIView(ListCreateAPIView):
    serializer_class = UserSerializer
    queryset = UserModel.objects.all()

    def create(self, request, *args, **kwargs):
        serializer = self.get_serializer(data=request.data, many=True)
        serializer.is_valid(raise_exception=True)
        self.perform_create(serializer)
        headers = self.get_success_headers(serializer.data)
        return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)

与默认create的唯一区别是get_serializer需要与many=True一起调用以支持创建对象列表。

【讨论】:

  • 这会自动命中我在 UserSerializer 上使用的 list_serializer_class' 创建方法吗?或者怎么做?
  • 它仍然说,“ListSerializer 不可迭代”我已经在帖子中编辑了回溯...我猜它与 drf 模板有关
猜你喜欢
  • 1970-01-01
  • 2019-06-17
  • 2019-12-26
  • 2017-02-19
  • 2016-10-01
  • 2016-07-01
  • 2018-02-05
  • 2017-10-28
  • 1970-01-01
相关资源
最近更新 更多