我目前正在开发一个Web应用程序,它使用API作为大学项目的后端。
我已经读过DRF是开发和部署API的最快,最简单的方法,我已经完成了整个官方的工作
文档,我似乎不明白我的ViewSet和Serializer中的以下内容。
这是我的API的一个端点,称为机场。
返回json / csv指向美国可用机场的链接列表。
/airports
GET
[
{
"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或我可以使用的任何学习材料来解决这个问题的提示?
如果你想修改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)
我认为照顾任何新事物的最佳方式是他们的代码库。对于ModelViewset,您应该从views
link开始,探索它提供的功能以及我如何自定义它们。