Django 实现 RESTful API

一个超快、超极速的 Django 入门教程

直接从 PyCharm 开始就可以

创建项目

目录介绍

在完成项目依赖的安装和初始化之后,就可以看到以下目录

  • manage.py 是 Django 提供的命令行操作脚本
  • storeProject
    • init.py 声明了 storeProject 为一个模块
    • urls.py 用于配置 url 映射的文件
    • settings.py 项目相关应用配置
    • asgi.py 与 wsgi.py 是项目部署相关文件

DRF 安装

pip3 install djangorestframework

使用该命令安装 drf 的依赖\库\包

修改 settings.py

将 drf 注册到应用里面

在 settings.py 中找到INSTALLED_APPS

然后添加rest_framework如下即可

1
2
3
4
5
6
7
8
9
INSTALLED_APPS = [
'rest_framework',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]

DRF 启动

启动项目,仅需点击 PyCharm 右上角的运行按钮

创建 api

创建视图 views

在项目目录下,创建一个名为 api 的包,并且再创建一个 views.py 文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# -*- coding:utf-8 -*-
# Author: Zachary
from rest_framework.decorators import api_view
from rest_framework.response import Response


@api_view(['GET'])
def get_data(request):
goods = {
"name": "苹果",
"price": 12.0
}
return Response(goods)

创建 urls

在 api 包下创建一个 urls.py 文件

编写上面创建的视图的 url 映射

1
2
3
4
5
6
7
8
# -*- coding:utf-8 -*-
# Author: Zachary
from django.urls import path
from . import views

urlpatterns = [
path('', views.get_data),
]

导入映射

在项目目录的 storeProject 下找到 urls.py

1
2
3
4
5
6
7
from django.contrib import admin
from django.urls import path, include

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

重启项目后可以看到以下内容

创建应用

可以在命令行中通过python manage.py startapp [应用名称]来创建一个新的应用

创建 goods

python manage.py startapp goods

执行命令之后会发现,目录结构多了一个 goods 包

注册 goods

在 storeProject 下的 settings.py 下注册下刚才创建的 goods

1
2
3
4
5
6
7
8
9
10
INSTALLED_APPS = [
'goods',
'rest_framework',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]

goods 模型

在新创建的 goods 包下找到 models.py 文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
from django.db import models


# Create your models here.

class Goods(models.Model):
name = models.CharField(max_length=100)
price = models.FloatField()
description = models.TextField()
created_at = models.DateTimeField(auto_now_add=True)

def __str__(self):
return self.name

创建好之后别忘记执行python manage.py makemigrations迁移命令,更新数据库变化,包括增删表,修改字段等操作,还可以保持数据库字段与类模型的同步;

之后还需要再次执行一下 migrate 命令,python manage.py migrate

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
(venv) ➜  storeProject python manage.py makemigrations
Migrations for 'goods':
goods/migrations/0001_initial.py
- Create model Goods
(venv) ➜ storeProject python manage.py migrate
Operations to perform:
Apply all migrations: admin, auth, contenttypes, goods, sessions
Running migrations:
Applying contenttypes.0001_initial... OK
Applying auth.0001_initial... OK
Applying admin.0001_initial... OK
Applying admin.0002_logentry_remove_auto_add... OK
Applying admin.0003_logentry_add_action_flag_choices... OK
Applying contenttypes.0002_remove_content_type_name... OK
Applying auth.0002_alter_permission_name_max_length... OK
Applying auth.0003_alter_user_email_max_length... OK
Applying auth.0004_alter_user_username_opts... OK
Applying auth.0005_alter_user_last_login_null... OK
Applying auth.0006_require_contenttypes_0002... OK
Applying auth.0007_alter_validators_add_error_messages... OK
Applying auth.0008_alter_user_username_max_length... OK
Applying auth.0009_alter_user_last_name_max_length... OK
Applying auth.0010_alter_group_name_max_length... OK
Applying auth.0011_update_proxy_permissions... OK
Applying auth.0012_alter_user_first_name_max_length... OK
Applying goods.0001_initial... OK
Applying sessions.0001_initial... OK
(venv) ➜

至此完成了模型的创建和数据的迁移操作

添加数据

接下来使用 admin 控制台来添加数据

创建超级管理员

使用命令创建一个超级管理员用户

python manage.py createsuperuser

创建一个名称为:admin,密码为:admin 的超级用户

1
2
3
4
5
6
7
8
9
10
(venv) ➜  storeProject python manage.py createsuperuser
Username (leave blank to use 'zachary'): admin
Email address:
Password:
Password (again):
The password is too similar to the username.
This password is too short. It must contain at least 8 characters.
This password is too common.
Bypass password validation and create user anyway? [y/N]: y
Superuser created successfully.

注册数据模型

在 goods 应用下的 admin.py 中注册 goods 数据模型

1
2
3
4
5
6
7
from django.contrib import admin

from . import models

# Register your models here.
admin.site.register(models.Goods)

之后重新启动一下服务

admin 管理后台

在浏览器中输入localhost:8000/admin进入 admin 管理后台

使用上面创建的超级管理员账号密码进行登录

Add goods

点击 GOODS 下的 Goodss 右侧的+Add 按钮

然后现在就有两个商品了

CRUD

序列化

先把数据序列化功能实现了,序列化实现了 Python 类与 json 数据的转化

在项目目录/api 下新建一个 serializers.py

1
2
3
4
5
6
7
8
9
10
11
# -*- coding:utf-8 -*-
# Author: Zachary
from rest_framework import serializers

from goods.models import Goods


class GoodsSerializer(serializers.ModelSerializer):
class Meta:
model = Goods
fields = '__all__'

查询商品列表

在项目目录/api 的 views.py 下修改

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# -*- coding:utf-8 -*-
# Author: Zachary
from rest_framework.decorators import api_view
from rest_framework.response import Response

from api.serializers import GoodsSerializer
from goods.models import Goods


@api_view(['GET'])
def goods_list(request):
goods = Goods.objects.all()
serializer = GoodsSerializer(goods, many=True)
return Response(serializer.data)

下一步需要修改/api 下的 urls.py

1
2
3
4
5
6
7
8
# -*- coding:utf-8 -*-
# Author: Zachary
from django.urls import path
from . import views

urlpatterns = [
path('goods/', views.goods_list),
]

重启项目后localhost:8000/goods/查看查询结果

添加商品

直接在之前的视图上面修改一下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# -*- coding:utf-8 -*-
# Author: Zachary
from rest_framework import status
from rest_framework.decorators import api_view
from rest_framework.response import Response

from api.serializers import GoodsSerializer
from goods.models import Goods


@api_view(['GET', 'POST'])
def goods_list(request):
if request.method == 'GET':
goods = Goods.objects.all()
serializer = GoodsSerializer(goods, many=True)
return Response(serializer.data)
elif request.method == 'POST':
serializer = GoodsSerializer(data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)

然后这个新增商品的功能用 postman 测一下

查询、修改、删除具体商品

仍旧是在/api 下的 views.py 中添加一个 view 视图

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
# -*- coding:utf-8 -*-
# Author: Zachary
from rest_framework import status
from rest_framework.decorators import api_view
from rest_framework.response import Response

from api.serializers import GoodsSerializer
from goods.models import Goods


@api_view(['GET', 'POST'])
def goods_list(request):
if request.method == 'GET':
goods = Goods.objects.all()
serializer = GoodsSerializer(goods, many=True)
return Response(serializer.data)
elif request.method == 'POST':
serializer = GoodsSerializer(data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)


@api_view(['GET', 'PUT', 'DELETE'])
def goods_detail(request, id):
try:
goods = Goods.objects.get(id=id)
except Goods.DoesNotExist:
return Response(status=status.HTTP_404_NOT_FOUND)
if request.method == 'GET':
serializer = GoodsSerializer(goods)
return Response(serializer.data)
elif request.method == 'PUT':
serializer = GoodsSerializer(goods, data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
elif request.method == 'DELETE':
goods.delete()
return Response(status=status.HTTP_204_NO_CONTENT)

同样在/api 的 urls.py 得添加上新的 url

1
2
3
4
5
6
7
8
9
# -*- coding:utf-8 -*-
# Author: Zachary
from django.urls import path
from . import views

urlpatterns = [
path('goods/', views.goods_list),
path('goods/<int:id>', views.goods_detail),
]

测试

查询具体商品

修改具体商品

删除具体商品

更新: 2024-07-10 22:34:56
原文: https://www.yuque.com/zacharyblock/cx2om6/dmf3g69cggt8iatm