【问题标题】:Django REST API one endpoint for CRUD用于 CRUD 的 Django REST API 一个端点
【发布时间】: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 似乎表明您只需要指定querysetserializer_class。尽量不要定义get_queryset()
  • @e1v1s 单端点是什么意思?
  • @JPG 我的意思是我希望能够向计算机发送 GET/PUT/DELETE 请求/ 并能够获取该计算机 ID、更新该计算机 ID 或删除它,都来自那个端点
  • 如果你想创建一个新的计算机实例,computer_id 的值是多少?
  • 这就是为什么我提到 GET/PUT/DELETE 而不是 POST。如果我想发布一个新的 computer_id,那么它必须是另一个端点?

标签: python rest http django-rest-framework


【解决方案1】:

你可以做这样的操作。

class Example(APIView):

    def get(self, request):
         your code
         return Response(....)

    def post(self, request):
         your code
         return Response(....)

    def put(self, request):
        your code
        return Response(.....)

    def delete(self, request):
        your code
        return Response(....)

【讨论】:

  • 或者你可以使用通用 APIView
  • 在传递给这些方法之前,我可以使用get_queryset 根据computer/&lt;computer_id&gt; 进行过滤吗? Django 如何知道用户何时发送PUTDELETE
  • 如果request.method为delete,Django会自动调用DELETE方法。
  • 您可以在 genericAPIviews 中使用 get_queryset
  • 在这种情况下,你的类定义变成类 Example(generics.CreateAPIView, generics.RetrieveUpdateDestroyAPIView):
猜你喜欢
  • 2019-02-06
  • 1970-01-01
  • 1970-01-01
  • 2018-04-29
  • 1970-01-01
  • 1970-01-01
  • 2017-10-02
  • 2019-04-22
  • 2022-07-29
相关资源
最近更新 更多