通过Django REST API删除对象

时间:2018-07-29 08:40:00

标签: python json django rest django-rest-framework

我正在尝试使用Django REST API删除“产品”对象,但不知道该怎么做。

序列化器:

def create_product(request):
    data = request.POST
    serializer = ProductSerializer(data=data)
    if serializer.is_valid():
        serializer.save()

我可以使用此功能创建产品

npm install -g --production windows-build-tools

但是我不知道如何删除

没有serializer.delete()方法。

4 个答案:

答案 0 :(得分:1)

首先,您应该知道如何使用 django rest_framework 中的 Router 和 ModelViewSet 以及 GenericViewSet 类,而不是 Product 应用程序,假设您有 Customer 应用程序。 你应该从 views.py 中的 views.ModelViewSet 或 views.GenericViewSet 和 mixins.DestroyModelMixin 继承你的类视图集,就像吹一样

class CustomerViewSet(viewsets.GenericViewSet, mixins.DestroyModelMixin):

class CustomerViewSet(viewsets.ModelViewSet):

并像这样为该视图集定义 serilaizer 类

class CustomerViewSet(viewsets.GenericViewSet, mixins.DestroyModelMixin):
      serilaizer_class = CustomerSerializer

那么你应该在你的 appName 文件夹中为所有对 api 的请求定义路由器 并且您应该在该文件夹中创建 urls.py 文件,如下所示

<块引用>

you can see customer app folder in my project and urls.py

在 urls.py 中像这样定义路由器和 url 模式

<块引用>

app_name variable define the name of url used by revers function

转到应用程序文件夹 (app/urls.py) 中的 urls.py 并定义如下路径“您应该定义一个路径来引用 customer/urls.py .. 我们创建 customer/urls.py在上一步中"

<块引用>

Define path in (app/urls.py)

OK .. 在浏览器中运行你的项目并输入你的本地主机地址 http://(您的本地主机地址)/api/customer/customers/1/ 带有 DELETE 请求(不是 POST、GET 或 PATCH 请求)

这是一些关于路由器和视图集的链接

<块引用>

路由器:https://www.django-rest-framework.org/api-guide/routers/

<块引用>

模型视图集:https://www.django-rest-framework.org/api-guide/viewsets/#modelviewset

<块引用>

通用视图集:https://www.django-rest-framework.org/api-guide/viewsets/#genericviewset

答案 1 :(得分:0)

您可以使用查询集来做到这一点:

@api_view(["DELETE"])
def product_delete_rest_endpoint(request, product_id):
    Product.objects.get(id=product_id).delete()
    return Response()

答案 2 :(得分:0)

如果您的视图(集合)是从DestroyModelMixin继承的,或者是从其继承的视图集,例如开箱即用地支持ModelViewSet,http DELETE。您可以进行卷曲测试,例如curl -X DELETE "http://localhost:8000/your-api/products/<product-id>"

答案 3 :(得分:0)

我不确定您在哪里使用ModelViewset类作为视图。无论如何,如果您要进行CRUD操作,我都会推荐它。
views.py

from rest_framework import viewsets


class ProductAPI(viewsets.ModelViewSet):
    serializer_class = ProductSerializer
    queryset = Product.objects.all()

urls.py

from rest_framework.routers import DefaultRouter

router = DefaultRouter()
router.register(r'product', ProductAPI)
urlpatterns = [
                  # Your other patterns

              ] + router.urls

因此,您将获得如下的API集,

| API end-points       | HTTP Method   | Result                                       |
|--------------------- |-------------  |------------------------------------------    |
| /product             | GET           | List of product                              |
| /product             | POST          | Create new product                           |
| /product/{product_pk}| GET           | Retrieve details of particular product       |
| /product/{product_pk}| PUT           | Fully update particular product's info       |
| /product/{product_pk}| PATCH         | Partially update particular product's info   |
| /product/{product_pk}| DELETE        | Delete particular product's details from DB  |


因此,您要做的就是将一个HTTP Delete请求发送到
/your-prefix/product/product_id/