Как изменить ответ извлечения набора в Django Rest Framework? - PullRequest
0 голосов
/ 13 марта 2019

В настоящее время я разрабатываю веб-приложение, которое использует API в качестве бэкенда для университетского проекта.

И я читал, что DRF - это самый быстрый и простой способ разработки и развертывания API, я уже прошел весь их официальный

документации, и я, кажется, не понимаю, как я мог сделать следующее в их ViewSet и Serializer.

Вот одна конечная точка моего API, называемая аэропортами.

Все аэропорты доступны в США

Возвращает список ссылок json / csv на доступные аэропорты в США.

  • URL

    /airports

  • Метод:

    GET

  • Успешный ответ:

    • Код: 200
      Содержание:

      [
        {
            "airport": {
                "code": "PHL",
                "name": "Philadelphia, PA: Philadelphia International",
              "id": 123,
                "url": "/airports/123"
            },
        {
            "airport": {
                "code": "AHR",
                "name": "American Hour Rapid",
            "id": 125,
                "url": "/airports/125"
        }
        .
        .
        .
      ]
    

Показать информацию об аэропорте

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

  • URL

/airports/:id

  • Метод:

GET

  • URL-параметры

    Требуется:

    id=[integer]

  • Успешный ответ:

{
    "airport": {
      "code": "PHL",
      "name": "Philadelphia, PA: Philadelphia International",
      "id": 123,
      "url": "/airports/123"
    },
    "routes_link": "/airports/123/routes",
    "carriers": [
        {
          "id": 124,
          "url": "/carriers/124?airport_id=123",
          "statistics_url":"/airports/1carrier=124&statistics='flights'"
        },
        .
        .
        .
      ]
}

Мне удалось сделать / аэропорты правильно перечисляя все доступные аэропорты в базе данных, но при использовании ViewSet я не знаю, как «настроить» ответ при попытке получить информацию только об одном аэропорту, указанном идентификатором и в приложении маршруты будут генерироваться динамически, и я планировал добавить в тело ответа, а не другое поле в модели.

Модель:

class Carrier(models.Model):
    code = models.CharField(max_length=10)
    name = models.TextField()
    #airports = models.ManyToManyField(Airport) 

    def __str__(self):
        return self.name

class Airport(models.Model):
    code = models.CharField(max_length=10)
    name = models.TextField()
    carriers = models.ManyToManyField(Carrier, related_name='airports')

    def __str__(self):
        return self.name

сериализаторы:

class AirportSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = models.Airport
        fields = ('id', 'name', 'code', 'url')

class CarrierSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = models.Carrier
        fields = ('id', 'name', 'code', 'url')

Вид:

class AirportList(viewsets.ModelViewSet):
    queryset = models.Airport.objects.all()
    serializer_class = AirportSerializer
    # @Override something here?

У кого-нибудь есть совет, как я могу подойти к этому, используя DRF или любой другой учебный материал, который я могу использовать?

1 Ответ

2 голосов
/ 13 марта 2019

Если вы хотите изменить retreive функциональность ModelViewset, вы можете перезаписать retreive метод и делать все, что захотите. mixin's ссылка

class AirportList(viewsets.ModelViewSet):
    queryset = models.Airport.objects.all()
    serializer_class = AirportSerializer
    def retrieve(self, request, *args, **kwargs):
        # do your customization here
        instance = self.get_object()
        serializer = self.get_serializer(instance)
        return Response(serializer.data)

Как исследовать DRF

Я думаю, что лучший способ заботиться о любой новой вещи - это их кодовая база. Для ModelViewset вы должны начать с views ссылка и изучить, какие функции он предоставляет и как я могу их настроить.

...