【发布时间】:2018-01-15 08:20:14
【问题描述】:
我有一个或多或少看起来像这样的模型:
class Starship(models.Model):
id = models.UUIDField(default=uuid4, editable=False, primary_key=True)
name = models.CharField(max_length=128)
hull_no = models.CharField(max_length=12, unique=True)
我有一个不起眼的StarshipDetailSerialiser 和StarshipListSerialiser(我想最终显示不同的字段,但现在它们是相同的),它们都是serializers.ModelSerializer 的子类。它有一个 HyperlinkedIdentityField 引用回 (UU)ID,使用与原始 HyperlinkedIdentityField 非常相似但能够规范化和处理 UUID 的自制类:
class StarshipListSerializer(HyperlinkedModelSerializer):
uri = UUIDHyperlinkedIdentityField(view_name='starships:starship-detail', format='html')
class Meta:
model = Starship
fields = ('uri', 'name', 'hull_no')
最后,有一个列表视图(ListAPIView)和一个详细视图,如下所示:
class StarshipDetail(APIView):
"""
Retrieves a single starship by UUID primary key.
"""
def get_object(self, pk):
try:
return Starship.objects.get(pk=pk)
except Starship.DoesNotExist:
raise Http404
def get(self, request, pk, format=None):
vessel = self.get_object(pk)
serializer = StarshipDetailSerialiser(vessel, context={'request': request})
return Response(serializer.data)
详细视图的 URL 架构当前正在根据 UUID 调用视图:
...
url(r'vessels/id/(?P<pk>[0-9A-Fa-f\-]+)/$', StarshipDetail.as_view(), name='starship-detail'),
...
我现在希望用户不仅可以通过 UUID 还可以通过船体编号导航和找到同一艘船,例如vessels/id/abcde1345...and so on.../ 和 vessels/hull/H1025/ 将能够解析到同一个实体。理想情况下,无论是从 ID 还是船体编号到达详细视图,在列表中也略有改动的序列化程序应该能够将 ID 超链接到基于 ID 的链接和船体超链接到基于船体编号的链接 (vessels/hull/H1025/)。这是可能吗?如果是这样,我会怎么做?
【问题讨论】:
标签: python django rest django-rest-framework