Django REST API – 使用DRF的CRUD

Django REST API – 使用DRF的CRUD

Django REST框架是用来非常容易和有效地创建网络API的。这是对Django框架的一个封装。在通过REST框架创建API之前有三个阶段,将Model的数据转换为JSON/XML格式(序列化),将这些数据渲染到视图中,创建一个用于映射到视图集的URL。

在本教程中,我们将讨论使用Django REST API的CRUD操作。它假定你熟悉Django基础知识–Django教程。

我们要建造什么

在本教程中,我们将为超市应用程序构建简单的REST API。这个商店包含各种食品、饮料和家用产品,被组织成各种类别。这些类别有子类别,子类别下有商品。每个商品都有一个价格,它可以被出售。现在我们应该能够使用DRF APIs从我们的数据库中添加、更新、查看和删除这些记录。

如何安装Django REST框架

要在Windows、Linux或任何操作系统上安装Django REST框架,需要pip包。要查看如何在你的操作系统上安装pip,请查看 – PIP安装 – Windows || Linux 。

现在,运行一个简单的命令。

pip install djangorestframework

Django REST API - 使用DRF的CRUD

安装完REST框架后,进入settings.py,在INSTALLED_APPS底部添加’rest_framework’。

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'rest_framework',
      
]

更多信息请参考我们的文章Django REST框架安装。

创建应用

在安装了DRF并将其添加到settings.py中后,让我们使用命令创建一个应用程序–

python manage.py startapp api

一个名字为api的文件夹现在应该已经被注册了。

Django REST API - 使用DRF的CRUD

让我们把这个应用程序添加到INSTALLED_APPS和urls.py中。

In, settings.py,

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'rest_framework',
    'api.apps.ApiConfig',
  
]

现在,在urls.py中添加api urls。在GFG_REST.urls.py中。

from django.contrib import admin
from django.urls import path, include
  
urlpatterns = [
    path('admin/', admin.site.urls),
    path('api/', include('api.urls')),
]

现在让我们在我们的api文件夹中创建urls.py —

In api/urls.py

from django.urls import path
  
urlpatterns = [
      
]

创建模型

现在让我们来创建我们的模型。我们将创建一个项目模型。这个模型将被API用来执行CRUD操作。

from django.db import models
  
class Item(models.Model):
    category = models.CharField(max_length=255)
    subcatgeory = models.CharField(max_length=255)
    name = models.CharField(max_length=255)
    amount = models.PositiveIntegerField()
  
    def __str__(self) -> str:
        return self.name

现在,在我们的应用程序准备好之后,让我们为我们的Item类创建序列化器。

序列化

Django REST框架中的序列化器将对象转换为javascript和前端框架能够理解的数据类型。序列化器还提供了反序列化功能,在首先验证了传入的数据后,允许将解析的数据转换回复杂的类型。最常用的两个主要序列化器是ModelSerializer和HyperLinkedModelSerialzer。

在本教程中,我们将使用ModelSerializer。如果你想知道更多关于手动创建序列化器的信息,那么请参考下面的文章——。

  • 序列化器 – Django REST框架
  • 序列化器中的超链接模型序列化器 – Django REST框架

ModelSerializer

ModelSerializer是在默认的序列化器之上的一个抽象层,它允许为Django中的模型快速创建一个序列化器。它提供了一个快捷方式,让你自动创建一个带有与模型字段对应的字段的序列器类。ModelSerializer类与普通的Serializer类是一样的,除了。

  • 它将根据模型自动为你生成一组字段。
  • 它将自动为序列化器生成验证器,例如唯一的验证器。
  • 它包括.create()和.update()的简单默认实现。

现在,让我们在api文件夹中创建我们的serlializers.py文件,并添加以下代码 —

from django.db.models import fields
from rest_framework import serializers
from .models import Item
  
class ItemSerializer(serializers.ModelSerializer):
    class Meta:
        model = Item
        fields = ('category', 'subcatgeory', 'name', 'amount')

创建视图

为了将数据渲染到前端,并处理来自用户的请求,我们需要创建一个视图。在Django REST框架中,我们称这些为视图集,所以让我们在apis/views.py中创建一个视图。

from rest_framework.decorators import api_view
from rest_framework.response import Response
from .models import Item
from .serializers import ItemSerializer
  
@api_view(['GET'])
def ApiOverview(request):
    api_urls = {
        'all_items': '/',
        'Search by Category': '/?category=category_name',
        'Search by Subcategory': '/?subcategory=category_name',
        'Add': '/create',
        'Update': '/update/pk',
        'Delete': '/item/pk/delete'
    }
  
    return Response(api_urls)

在上面的代码中,api_view装饰器接受了一个HTTP方法的列表,这些方法是视图应该响应的。其他方法将以 “不允许的方法 “进行响应。

现在让我们更新我们的api/urls.py文件 –

from django.urls import path
from . import views
  
urlpatterns = [
    path('', views.ApiOverview, name='home')
]

现在让我们放开我们的服务器。运行以下命令 –

python manage.py makemigrations
python manage.py migrate
python manage.py runserver

现在前往http://127.0.0.1:8000/api/

Django REST API - 使用DRF的CRUD

现在让我们通过API实现我们的CRUD操作。

Django Rest框架–创建视图

现在我们的创建视图将使用POST方法将数据插入我们的数据库中。让我们在views.py文件中创建我们的add_items函数。

from rest_framework import serializers
from rest_framework import status
  
@api_view(['POST'])
def add_items(request):
    item = ItemSerializer(data=request.data)
  
    # validating for already existing data
    if Item.objects.filter(**request.data).exists():
        raise serializers.ValidationError('This data already exists')
  
    if item.is_valid():
        item.save()
        return Response(item.data)
    else:
        return Response(status=status.HTTP_404_NOT_FOUND)

现在让我们更新我们的urls.py文件,为我们刚刚创建的创建视图函数添加端点。

from django.urls import path
from . import views
  
urlpatterns = [
    path('', views.ApiOverview, name='home'),
    path('create/', views.add_items, name='add-items'),
]

访问 http://127.0.0.1:8000/api/create/

Django REST API - 使用DRF的CRUD

Django Rest Framework – 列表视图

现在我们的列表视图将使用GET方法从数据库中获取数据。让我们在views.py文件中创建view_items函数。这个view_items函数将显示所有的数据或由用户根据类别、子类别或名称查询的过滤数据。

In views.py

@api_view(['GET'])
def view_items(request):
    
    # checking for the parameters from the URL
    if request.query_params:
        items = Item.objects.filter(**request.query_param.dict())
    else:
        items = Item.objects.all()
  
    # if there is something in items else raise error
    if items:
        data = ItemSerializer(items)
        return Response(data)
    else:
        return Response(status=status.HTTP_404_NOT_FOUND)

In urls.py

from django.urls import path
from . import views
  
urlpatterns = [
    path('', views.ApiOverview, name='home'),
    path('create/', views.add_items, name='add-items'),
    path('all/', views.view_items, name='view_items'),
  
]

现在访问http://127.0.0.1:8000/api/all/

Django REST API - 使用DRF的CRUD

这个视图功能还可以让我们按类别或子类别过滤。你可以使用以下任一网址,即http://127.0.0.1:8000/api/?category=category_name 或 http://127.0.0.1:8000/api/?subcategory=category_name,分别过滤类别和子类别。你也可以使用http://127.0.0.1:8000/api/all/?name=item_name 来搜索一个特定的项目。

如果我们访问http://127.0.0.1:8000/api/all/?category=food,我们的搜索结果将缩小到——。

Django REST API - 使用DRF的CRUD

Django Rest Framework – 更新视图

现在对于我们的更新视图函数,我们将使用POST方法。让我们在views.py文件中创建我们的update_items函数。这个视图函数将从数据库中更新一个特定的项目。它将在主键的帮助下过滤该项目。

In views.py

@api_view(['POST'])
def update_items(request, pk):
    item = Item.objects.get(pk=pk)
    data = ItemSerializer(instance=item, data=request.data)
  
    if data.is_valid():
        data.save()
        return Response(data.data)
    else:
        return Response(status=status.HTTP_404_NOT_FOUND)

In urls.py

from django.urls import path
from . import views
  
urlpatterns = [
    path('', views.ApiOverview, name='home'),
    path('create/', views.add_items, name='add-items'),
    path('all/', views.view_items, name='view_items'),
    path('update/<int:pk>/', views.update_items, name='update-items'),
  
]

现在前往http://127.0.0.1:8000/api/all/?name=potato

Django REST API - 使用DRF的CRUD

Django Rest Framework – 删除视图

对于我们的删除视图函数,我们将使用DELETE方法。让我们在views.py文件中创建我们的delete_items函数。这个视图函数将从数据库中删除一个特定的项目。

In views.py

@api_view(['DELETE'])
def delete_items(request, pk):
    item = get_object_or_404(Item, pk=pk)
    item.delete()
    return Response(status=status.HTTP_202_ACCEPTED)

In urls.py

from django.urls import path
from . import views
  
urlpatterns = [
    path('', views.ApiOverview, name='home'),
    path('create/', views.add_items, name='add-items'),
    path('all/', views.view_items, name='view_items'),
    path('update/<int:pk>/', views.update_items, name='update-items'),
    path('item/<int:pk>/delete/', views.delete_items, name='delete-items'),
      
]

现在访问http://127.0.0.1:8000/api/item/pk/delete/。为了更好地理解,请看下面的GIF。

Django REST API - 使用DRF的CRUD

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程