我有一个模型,或多或少看起来像这样:Django REST框架 - 多个查找字段?
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/
)。这是可能吗?如果是的话,我会怎么做呢?