使用DRF管理具有给定ID或特定字段的对象

2024-04-29 00:31:36 发布

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

我有一个包含两个唯一字段的模型:

class Instance(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    name = models.CharField(max_length=64, unique=True)

views.py中:

class InstanceDetail(generics.RetrieveUpdateAPIView):
    permission_classes = [IsAuthenticated, ]
    queryset = Instance.objects.all()
    serializer_class = InstanceSerializer

urls.py中:

    path('<uuid:pk>/', InstanceDetail.as_view()),

现在,一切都按预期工作,我可以使用带有实例ID的API

但是如果我想用name而不是id来做同样的事情呢?因此,API将为相同的url提供idname?有没有一种不重复任何代码的简单方法


Tags: instancekeynamepy模型apiidtrue
1条回答
网友
1楼 · 发布于 2024-04-29 00:31:36

我的两分钱在这上面

  1. path('<str:name>/', InstanceDetail.as_view()),与您提到的urls.py一起添加到您的urls.py中,因此,您现在应该使用相同的view
  2. 重写get_object()以根据使用视图的url更改lookup_field

因此,最后的views.py将有:

class InstanceDetail(generics.RetrieveUpdateAPIView):
    permission_classes = [IsAuthenticated, ]
    queryset = Instance.objects.all()
    serializer_class = InstanceSerializer

    def get_object(self):
        if 'pk' in self.kwargs:
            self.lookup_field = 'pk'
        elif 'name' in self.kwargs:
            self.lookup_field = 'name'

        return super(InstanceDetail,self).get_object()

相关问题 更多 >