Django REST端点的对象列表

时间:2018-12-21 08:04:21

标签: django architecture django-rest-framework

我有一个Django应用程序,该应用程序可以在/api/v1/crm/ticket下通过POST调用创建票证。现在,我希望能够将不同类型的票证(而不是示例代码中的票证)发送到具有“动态”序列化程序的同一终结点,具体取决于发送的数据。端点应根据请求数据中存在的数据属性选择正确的“模型”。

我尝试使用Django db.models,但是当我将票证写到另一个外部系统并通过传递票证时却没有使它们工作,所以没有数据库表存在,并且该模型缺少必要的主键。

您能帮我如何添加更多具有相同端点的故障单类型吗?

代码

class TicketAPIView(CreateAPIView):
    serializer_class = TicketSerializer
    permission_classes = (IsAuthenticated,)


class TicketSerializer(serializers.Serializer):

    title = serializers.CharField(max_length=256)
    description = serializers.CharField(max_length=2048)
    type = serializers.ChoiceField(TICKET_TYPES)

    def create(self, validated_data):

        if validated_data['type'] == 'normal':
            ticket = TicketPOJO(
                validated_data['title'],
                validated_data['description'],
            )

            ...
        else:
            raise Exception('Ticket type not supported')

        return ticket

文件

/my-cool-app
 /apps
  /crm
   /api
    /v1
     /serializers
      serializers.py
     __init.py
     urls.py
     views.py
   /clients
    /ticket
     provider.py
    /user
     provider.py
  /search
 /config

1 个答案:

答案 0 :(得分:0)

由于每种票证类型的模型都不同,因此建议您创建一个单独的序列化程序,以一个通用视图验证每种不同模型的模型。

您可以覆盖get_serializer中的view方法,以根据票证类型选择适当的serializer。像这样

def get_serializer(self, *args, **kwargs):
        """
        Return the serializer instance that should be used for validating and
        deserializing input, and for serializing output.
        """
        type = self.request.data.get("type", '')
        if type === 'normal':
            return NormalTicketSerializer(*args, **kwargs)
        elif type == 'abnormal':
            return AbnormalTicketSerializer(*args, **kwargs)
        else:
            raise ParseError(detail='Ticket type not supported') # This will return bad request response with status code 400.

希望这会有所帮助。