代码之家  ›  专栏  ›  技术社区  ›  lony

对象列表的Django REST端点

  •  0
  • lony  · 技术社区  · 7 年前

    我有一个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 回复  |  直到 7 年前
        1
  •  0
  •   Haren Lewis    7 年前

    由于每个票证类型的模型都不同,我建议您创建一个单独的序列化程序,用一个通用视图为每个不同的模型验证它们。

    您可以覆盖 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.