如何在Django Rest Framework中更改视图集检索响应?

问题描述 投票:0回答:1

我目前正在开发一个Web应用程序,它使用API​​作为大学项目的后端。

我已经读过DRF是开发和部署API的最快,最简单的方法,我已经完成了整个官方的工作

文档,我似乎不明白我的ViewSet和Serializer中的以下内容。

这是我的API的一个端点,称为机场。

所有机场均在美国境内

返回json / csv指向美国可用机场的链接列表。

  • 网址 /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" } . . . ]

显示机场信息

返回在特定机场运营的运营商的所有链接,指向特定月份和年份的相关统计数据的链接以及指向机场路线的链接。如果未指定年份或月份,则默认值为具有最新日期的默认值。

  • 网址

/airports/:id

  • 方法:

GET

  • 网址参数 需要: 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时我不知道如何在尝试检索关于id指定的一个机场的信息时“自定义”响应应用程序将动态生成路由,我计划添加到响应主体而不是模型中的另一个字段。

楷模:

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或我可以使用的任何学习材料来解决这个问题的提示?

django python-3.x django-rest-framework django-views api-design
1个回答
2
投票

如果你想修改ModelViewset的retreive功能,你可以覆盖它的retreive方法,并做任何你想要的。 mixin's link

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)

How to explore DRF

我认为照顾任何新事物的最佳方式是他们的代码库。对于ModelViewset,您应该从viewslink开始,探索它提供的功能以及我如何自定义它们。

© www.soinside.com 2019 - 2024. All rights reserved.