【发布时间】:2019-03-09 08:25:01
【问题描述】:
我正在尝试将 GET/PUT/DELETE HTTP 方法映射到单个 Django REST API 端点。我可以覆盖默认的get_queryset 方法,基本上对数据库中的特定模型字段执行GET 请求,但我不确定要为PUT/DELETE 覆盖哪些类方法。如果我使用postman 执行PUT/DELETE,我会收到method not allowed 错误。
Models.py
class Computer(models.Model):
computer_id = models.IntegerField(unique=True)
city = models.CharField(max_length=50)
description = models.TextField(null=True, blank=True)
def __str__(self):
return str(self.computer_id)
Urls.py
router.register(r'computer/(?P<comp_id>[0-9]+)', ComputerViewSet, base_name='computers')
Views.py
class ComputerViewSet(viewsets.ModelViewSet):
serializer_class = ComputerSerializer
def get_queryset (self, *args, **kwargs):
comp_id = self.kwargs['comp_id']
queryset = Computer.objects.filter(computer_id=comp_id)
return queryset
Serializers.py
class ComputerSerializer(serializers.ModelSerializer):
class Meta:
model = Computer
fields = ('id', 'computer_id', 'city', 'description')
所以我尝试在Views.py 的类中覆盖其他方法失败:
def destroy(self, request, *args, **kwargs):
computer = self.get_object()
self.perform_destroy(computer)
computer.delete()
def update(self, request, *args, **kwargs):
#...
我的目标是拥有一个具有GET/PUT/DELETE 功能的端点。我该如何开始呢?
【问题讨论】:
-
我自己从未使用过 ModelViewSet 视图,但阅读django-rest-framework.org/api-guide/viewsets/#modelviewset 似乎表明您只需要指定
queryset和serializer_class。尽量不要定义get_queryset()。 -
@e1v1s 单端点是什么意思?
-
@JPG 我的意思是我希望能够向计算机发送 GET/PUT/DELETE 请求/
并能够获取该计算机 ID、更新该计算机 ID 或删除它,都来自那个端点 -
如果你想创建一个新的计算机实例,
computer_id的值是多少? -
这就是为什么我提到 GET/PUT/DELETE 而不是 POST。如果我想发布一个新的 computer_id,那么它必须是另一个端点?
标签: python rest http django-rest-framework