簡體   English   中英

Django REST API CRUD的一個端點

[英]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/將返回PK123Computer實例的詳細信息

推薦的代碼片段

 # 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM