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
安装完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的文件夹现在应该已经被注册了。
让我们把这个应用程序添加到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/
现在让我们通过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 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/
这个视图功能还可以让我们按类别或子类别过滤。你可以使用以下任一网址,即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 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 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。