Конечная точка REST Django для списка объектов - PullRequest
0 голосов
/ 21 декабря 2018

У меня есть приложение 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 голосов
/ 22 декабря 2018

Поскольку ваши модели различаются для каждого типа билета, я бы посоветовал вам создать отдельный сериализатор, который проверяет их для каждой отдельной модели с одним общим представлением.

Вы можете переопределить метод 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.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...