我目前正在开发一个使用 API 作为大学项目后端的 Web 应用程序。
我读过 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'"
},
.
.
.
]
}
我能够执行 /airports 正确列出数据库中的所有可用机场,但是在使用 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 或任何我可以使用的学习材料来解决这个问题?
原文由 murthaA 发布,翻译遵循 CC BY-SA 4.0 许可协议
如果你想修改
retrieve
的功能,你可以覆盖它的retrieve
方法并做任何你想做的事。mixin's
链接如何探索 DRF
我认为照顾任何新事物的最好方法是他们的代码库。对于 ModelViewset,您应该从
views
链接 开始,探索它提供的功能以及我如何自定义它们。