Django REST Framework更新了不在Model中的嵌套对象

时间:2017-11-08 02:59:24

标签: python django django-rest-framework

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

"有效载荷":

{
"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()

这是我的serialzier.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)

和我的view.py

class StagePositionListView(APIView):
    serializer_class = PositionSerializer

2 个答案:

答案 0 :(得分:1)

您可以轻松利用serializer(many=True),它将匹配序列化列表。你的序列化器将是:

class StagePositionSerializer(ModelSerializer):

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

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

答案 1 :(得分:0)

如果您只希望在数据前添加"stages:",则可以在视图集中创建自定义端点,并指定要返回的格式。

我不确定为什么你有一个模型序列化器以及一个非模型序列化器。这会给你带来什么?

以下是一些示例代码,可以将“get_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)

然后,如果您在网址whatever_your_url/is/get_stages上执行GET,您将获得所需的有效负载格式。