使用 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