Django REST Framework更新的嵌套对象不在模型中

2024-03-28 16:57:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我只想使用PUT更新我的\阶段中的所有订单,例如:

“有效载荷”:

{
"stages": [
    {
        "stage_id": 1,
        "position": 2
    },
    {
        "stage_id": 2,
        "position": 3
    },
    {
        "stage_id": 3,
        "position": 4
    }
]
}

以及“回应”:

{
"stages": [
    {
        "stage_id": 1,
        "position": 2
    },
    {
        "stage_id": 2,
        "position": 3
    },
    {
        "stage_id": 3,
        "position": 4
    }
]
}

但是我的模型中没有“阶段”,所以我不能使用ModelSerializer。但我必须先实现create()。 那么我应该如何实现更新呢?非常感谢。你知道吗

我的舞台模型是:

class Stage(models.Model):
    class Meta:
        db_table = 'stage'
    position = models.IntegerField()

这是我的序列器.py你知道吗

class StagePositionSerializer(ModelSerializer):
    """Serialize order"""
     # company_id = IntegerField(read_only=True)
    stage_id = IntegerField(source='id', read_only=True)
    position = IntegerField(min_value=0)

    class Meta:
        model = Stage
        fields = [
            'stage_id',
            'position'
        ]

class PositionSerializer(Serializer):
    stages = StagePositionSerializer(many=True)

还有我的视图.py你知道吗

class StagePositionListView(APIView):
    serializer_class = PositionSerializer

Tags: py模型idtruemodelspositionstage阶段
2条回答

如果只想在数据前面加上"stages:",可以在viewset中创建一个自定义端点,并指定要返回的格式。你知道吗

我不知道为什么你有一个模型序列化以及非模型序列化。这给你买了什么?你知道吗

下面是一些示例代码,可以将“get\u stages”添加到api url中。你知道吗

views.py:

class StagePositionViewSet(viewsets.ModelViewSet):
    queryset = Stage.objects.all()
    serializer_class = StagePositionSerializer


    @list_route(methods=['GET'])
    def get_stages(self, request, **kwargs):
        try:
            stage_list = Stage.objects.all()
            serializer = StagePositionSerializer(stage_list , many=True)
            results = dict()
            #this is where you add your prepended info
            results['stages'] = serializer.data
            return Response(results, status=status.HTTP_200_OK)
        except Exception as e:
        return Response(e, status=status.HTTP_400_BAD_REQUEST)

然后,如果您在URLwhatever_your_url/is/get_stages执行GET,您将获得所需的有效负载格式。你知道吗

您可以很容易地利用serializer(many=True),它将匹配序列化程序列表。您的序列化程序将是:

class StagePositionSerializer(ModelSerializer):

    class Meta:
        model = Stage
        fields = [
            'id',
            'position'
        ]

class PositionSerializer(Serializer):
    stages = StagePositionSerializer(many=True)

相关问题 更多 >