Django Rest Framework - 为GET和POST不同地序列化关系

时间:2017-02-03 17:46:53

标签: python django django-rest-framework

给出2个主要模型:TransportOrder和Company通过TransportOrderConsumer建立多对多的关系。我想实现以下目标。

GET TransportOrder:

列出了TransportOrder字段以及指向消费者的超链接列表。 我通过以下关于公司和序列化器的关系完成了这项工作

consumers = models.ManyToManyField(Company, through = "TransportOrderConsumer")

class TransportOrderReadSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = TransportOrder
        # fields = ('id', 'producer_system_code', 'status','producer', 'created_at')
        fields = (
            'id',
            'producer',
            'producer_system_code',
            'status',
            'producer',
            'created_at',
            'updated_at',
            'consumers'
        )
        # read_only_fields = ('updated_at')  

POST传输订单: 在POST序列化程序中,我想嵌套一个TransportOrderConsumerSerializer但是把它称为" consumer"以便get和post调用之间保持一致。

总结问题,是否有可能在一个序列化程序中消费者与公司对象相关,而在第二个(POST)中,消费者字段是否为TransportOrderConsumerSerializer?

1 个答案:

答案 0 :(得分:1)

您可以使用get_serializer_class为要使用的序列化程序启用请求类型。

示例代码:

from rest_framework import viewsets

class MyViewSet(viewsets.ModelViewSet):
    queryset = MyModel.objects.all()

    def get_serializer_class(self):
        """
        :return: serializer class based on the request type
        """
        if self.action == 'retrieve':
            return ps.MyModelDetailSerializer
        elif self.action == 'list':
            return ps.MyModelListSerializer
        elif self.action == 'create':
            return ps.MyModelCreateSerializer
        else:
            return ps.MyModelUpdateSerializer