使用 Django Rest Framework 的 ListSerializer 批量创建

Posted

技术标签:

【中文标题】使用 Django Rest Framework 的 ListSerializer 批量创建【英文标题】:bulk create using ListSerializer of Django Rest Framework 【发布时间】:2018-02-05 15:27:33 【问题描述】:

我正在尝试使用 Django Rest Framework 为某个表批量创建行。我在documentation 中看到 DRF 支持它。

views.py

class UserProfileFeedViewSet(viewsets.ModelViewSet):
    """Handles creating, reading and updating profile feed items."""

    authentication_classes = (TokenAuthentication,)
    queryset = models.ProfileFeedItem.objects.all()
    serializer_class = serializers.ProfileFeedItemSerializer(queryset, many=True)
    permission_classes = (permissions.PostOwnStatus, IsAuthenticated)

    def perform_create(self, serializer):
        """Sets the user profile to the logged in user."""

        serializer.save(user_profile=self.request.user)

序列化器.py

class ProfileFeedItemListSerializer(serializers.ListSerializer):
   def create(self,validated_data):
       feed_list = [ProfileFeedItem(**item) for item in validated_data]
       return ProfileFeedItem.objects.bulk_create(feed_list)

class ProfileFeedItemSerializer(serializers.ModelSerializer):
    """A serializer for profile feed items."""

    class Meta:
        model = models.ProfileFeedItem
        list_serializer_class = ProfileFeedItemListSerializer
        fields = ('id', 'user_profile', 'status_text', 'created_on')
        extra_kwargs = 'user_profile': 'read_only': True

当我尝试使用管理表单发布时,我总是收到此错误。你能帮我找出我在这里做错了什么吗?

/api/feed/ 'ProfileFeedItemListSerializer' 对象的 TypeError 不是 可调用请求方法:GET请求 网址:http://127.0.0.1:8080/api/feed/ Django 版本:1.11 异常 类型:TypeError 异常值:'ProfileFeedItemListSerializer' 对象不可调用异常 位置:/home/ubuntu/.virtualenvs/profiles_api/local/lib/python3.5/site-packages/rest_framework/generics.py 在 get_serializer 中,第 111 行 Python 可执行文件:/home/ubuntu/.virtualenvs/profiles_api/bin/python Python 版本:3.5.2

【问题讨论】:

【参考方案1】:

试试看:

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

def perform_create(self, serializer):
    if type(serializer.validated_data) == list:
         for item in serializer.validated_data:
              item.update('user_profile': self.request.user)
    else:
        serializer.validated_data.update('user_profile': self.request.user)
    serializer.save()

不幸的是,现在我无法检查解决方案,但也许它会给出正确的方法

【讨论】:

我能够使用此发布单个字典数据集,但发布字典列表继续抛出 AttributeError: 'list' object has no attribute 'get' 当我传递数据集列表时,代码流甚至没有达到 perform_create。它总是期望数据作为字典传递。必须有办法告诉 DRF 传入的数据是一个字典列表,而不是单个字典。 添加了create方法 太棒了...为传递的数据集创建了多行。但是 AttributeError: 'list' object has no attribute 'get' 跟踪仍然显示在控制台中..如何抑制它? AttributeError 仅在我从 Django Admin 表单发布时发生。通过邮递员发帖时不会发生这种情况。【参考方案2】:

Serializer_class 应该是类,而不是类实例。尝试改变这一点

serializer_class = serializers.ProfileFeedItemSerializer(queryset, many=True)

对此:

serializers.ProfileFeedItemSerializer

【讨论】:

我改变了它。我正在尝试发布以下数据集: [ "status_text": "Hello" , "status_text": "World" ] 现在,当我提交表单时,我在控制台中看到以下错误:AttributeError: 'list' object has no属性'get' @Prasanna 你能在问题中添加完整的错误文本吗? @Prasanna 尝试在 UserProfileFeedViewSet 中的 serializer.save(user_profile=self.request.user) 行之前添加 serializer = self.get_serializer(data=self.request.data, many=True) 添加了 get_serializer 但仍然与上面的完整跟踪相同的错误... @Prasanna 我改变了我的评论,你试过了吗?

以上是关于使用 Django Rest Framework 的 ListSerializer 批量创建的主要内容,如果未能解决你的问题,请参考以下文章

Django Rest Framework 和 django Rest Framework simplejwt 两因素身份验证

18-Django REST framework-使用Django开发REST 接口

如何在 django-rest-framework 中为 API 使用 TokenAuthentication

Django-rest-framework 和 django-rest-framework-jwt APIViews and validation Authorization headers

django rest framework中文介绍

使用 django-rest-framework-simplejwt 注册后返回令牌