【问题标题】:Django REST Framework unable to send multiple dataDjango REST Framework 无法发送多个数据
【发布时间】:2021-10-15 15:59:14
【问题描述】:

我正在尝试在单个 POST 中以列表形式发送多个 JSON 数据,例如 -

[
 {
    "name": "data",
 },
 {
    "name": "data",
 }
]

但出现以下错误。

{
"non_field_errors": [
    "Invalid data. Expected a dictionary, but got list."
]
}

这是我的代码 -

序列化器.py

class my_serializer_name(serializers.ModelSerializer):
class Meta:
    model = my_model
    fields = '__all__'

def validate(self, data):
    #Performing validation
    ......
    ......

viewsets.py

class my_viewset(viewsets.ModelViewSet):
queryset = models.my_model.objects.all()
serializer_class = serializers.my_serializer
http_method_names = ['get', 'post']

def list(self, request):
    # Note the use of `get_queryset()` instead of `self.queryset`
    queryset = self.get_queryset()
    serializer = serializers.my_serializer(queryset, many=True)
    return Response(serializer.data)

路由器.py

router = routers.DefaultRouter()
router.register('name' , my_viewset)

如何解决这个问题?

【问题讨论】:

    标签: python django api rest django-rest-framework


    【解决方案1】:

    我在 viewsets.py 文件中添加了 Create 方法,它似乎工作正常。

    def create(self, request, *args, **kwargs):
        serializer = self.get_serializer(data=request.data, many=isinstance(request.data,list))
        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)
    

    【讨论】:

      【解决方案2】:

      一种方法是重写 post 方法来指定序列化器:使用many=True而不是默认序列化器

      class my_viewset(viewsets.ModelViewSet):
          queryset = models.my_model.objects.all()
          serializer_class = serializers.my_serializer
          http_method_names = ['get', 'post']
      
          def post(self, request):
              serialized = my_serializer_name(data=request.data, many=True)
              serialized.is_valid(raise_exception=True)
              serialized.save()
      

      【讨论】:

      • 如果你指的是把这个方法放在views.py中,我没有在views.py上为REST框架写任何东西。我在 urls.py 上将 URL 作为 path('api/' , include(router.urls)) 传递,并且问题中提到了路由器和其他文件。这种方法有什么替代方案吗?
      • 既然您询问 POST 行为是否与 drf 提供的规范不同,覆盖该方法是有意义的。您必须将其作为 my_viewset 类的方法放在 viewsets.py 而不是 views.py
      • 我在 viewsets.py 上添加了 create 方法,它对我有用。谢谢。
      猜你喜欢
      • 2020-03-19
      • 2019-02-22
      • 2020-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-14
      • 2017-07-23
      • 1970-01-01
      相关资源
      最近更新 更多