gpt4 book ai didi

django - 使用 ListCreateAPIView 和 ListSerializer 进行批量创建

转载 作者:行者123 更新时间:2023-12-03 08:20:05 27 4
gpt4 key购买 nike

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

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

ListCreateAPIView是否会按照列表的长度调用create方法?如何覆盖它?ListSerializer,我根本不明白这一点。所以我必须有一个父列表序列化器和子模型序列化器。

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

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

当我尝试使用 ListCreateAPIView 时,它不断向我抛出错误 ListSerializer is not iterable 即使我设置了 much = True 后也是如此。

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

而且,当我阅读这篇关于使用 ListSerializer 进行批量创建的中等文章时,它一直告诉我类似“JSON 解析错误 - 需要 ',' 分隔符:第 4 行第 20 列(字符 72)”之类的内容

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

任何帮助将不胜感激。我是这个 REST 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 %}

最佳答案

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

ListCreateApiView用于通过 get 将功能添加到 list 对象,并通过 post 将功能添加到 View 中。

ListCreateApiView 的命名并不意味着您可以使用列表创建对象(尽管这种困惑是可以理解的)。不过,您仍然可以支持这一点,但您需要在 View 中编写自己的 .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的唯一区别是需要使用many=True调用get_serializer以支持创建对象列表。

关于django - 使用 ListCreateAPIView 和 ListSerializer 进行批量创建,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68099778/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com