[英]Django REST API one endpoint for CRUD
我正在嘗試將GET/PUT/DELETE
HTTP方法映射到單個Django REST API端點。 我可以覆蓋默認的get_queryset
方法,以對數據庫中的特定模型字段進行GET
請求,但不確定要為PUT/DELETE
覆蓋哪些類方法。 如果我使用postman
執行PUT/DELETE
出現method not allowed
錯誤。
型號
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
功能的端點。 我該如何開始呢?
您可以執行這樣的操作。
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(....)
將您的路由器定義更改為
router.register(r'computer', ComputerViewSet, base_name='computers')
將解決問題
除此之外, get_queryset()
似乎在您試圖獲取計算機實例的詳細信息 ,它等效於detail API 。 通過如上所述設置路由器定義,您將擁有此處所述的幾個端點
因此, /api/computer/
將返回所有結果,而/api/computer/123/
將返回PK為123
的Computer
實例的詳細信息
推薦的代碼片段
# urls.py router.register(r'computer', ComputerViewSet, base_name='computers') # views.py class ComputerViewSet(viewsets.ModelViewSet): queryset = Computer.objects.all() serializer_class = ComputerSerializer lookup_field = 'computer_id' # not required any kind of override here [for now :) ]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.