【问题标题】:Create Multiple Instances at Once Django Rest Framework一次创建多个实例 Django Rest 框架
【发布时间】:2021-07-13 00:34:01
【问题描述】:

似乎有很多关于此的文档,但似乎没有一个对我有用。我正在尝试构建一个同时创建一个或多个对象的 API 视图。

类似于传递以下内容:

[
    {
        "response": "I have no favourites",
        "user": 1,
        "update": "64c5fe6f-cb65-493d-8ef4-126db0195c33",
        "question": "297b46b4-714b-4434-b4e6-668ff926b38e"
    },
    {
        "response": "Good",
        "user": 1,
        "update": "64c5fe6f-cb65-493d-8ef4-126db0195c33",
        "question": "13916052-690e-4638-bb7c-908c38dcd75e"
    }
]

我当前的视图集

class FeedbackViewSet(viewsets.ModelViewSet):

    permission_classes = [AllowAny]
    queryset = Feedback.objects.all()
    serializer_class = FeedbackSerializer

和序列化器:

class ContributionSerializer(serializers.ModelSerializer):
    class Meta:
        model = Contribution
        fields = '__all__'

我尝试设置 FeedbackSerializer(many=True) 但这告诉我它不可调用。此外,我尝试了ListCreateAPIView,但这告诉我它需要字典而不是列表。

【问题讨论】:

标签: django django-rest-framework


【解决方案1】:

覆盖 create(...) 方法

from rest_framework.response import Response
from rest_framework import status


class FeedbackViewSet(viewsets.ModelViewSet):
    permission_classes = [AllowAny]
    queryset = Feedback.objects.all()
    serializer_class = FeedbackSerializer

    def create(self, request, *args, **kwargs):
        serializer = self.get_serializer(data=request.data, many=True) # not that `many=True` id mandatory since you are dealing with a list of of inputs
        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
        )

【讨论】:

  • 这行得通!谢谢。但是,仅适用于多个对象。知道如何使这种动态处理 1 个或多个吗?
  • 相应地控制many=True
【解决方案2】:

many=True 的想法是正确的。你只需要把它放在正确的位置......所以在 ViewSet 中:

class FeedbackViewSet(viewsets.ModelViewSet):

    permission_classes = [AllowAny]
    queryset = Feedback.objects.all()
    serializer_class = FeedbackSerializer

    def get_serializer(self, *args, **kwargs):
        # add many=True if the data is of type list
        if isinstance(kwargs.get("data", {}), list):
            kwargs["many"] = True

        return super(FeedbackViewSet, self).get_serializer(*args, **kwargs)

还有其他方法可以实现相同的行为,但我认为这很干净!

【讨论】:

  • 不幸的是似乎给了我一个错误:'ListSerializer' 对象不可迭代。它似乎创建了对象,所以猜测返回正在做一些奇怪的事情。
  • 我正在调查
猜你喜欢
  • 1970-01-01
  • 2016-04-23
  • 1970-01-01
  • 1970-01-01
  • 2020-05-15
  • 2021-12-04
  • 2018-06-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多