Django REST framework多个查找字段?

2024-06-28 16:24:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个或多或少像这样的模型:

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)

我有一个不起眼的StarshipDetailSerialiserStarshipListSerialiser(我想最终显示不同的字段,但现在它们是相同的),都是子类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')

最后,还有一个列表视图(aListAPIView)和一个详细视图,如下所示:

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还是hull number到达detail视图,serialiser也可以在列表中稍作更改后使用,它应该能够将ID超链接到基于ID的链接,并将hull超链接到基于hull number的链接(vessels/hull/H1025/)。这有可能吗?如果是的话,我该怎么办?


Tags: nameself视图idgetuuidmodelsclass