使用Django REST framework构建包含父表和子表的API ——从零基础到实战的详细步骤
——从零基础到实战的详细步骤)
目的:后端实现一个父表及两个子表的增删改查
适用人群:具有Python基础,但对开发比较小白的。我自己是具有人工智能算法开发和调试基础,但没接触过应用前后端的开发。本文偏实现逻辑步骤,但具体代码因为篇幅限制,只贴出了一部分
最终效果图:
查询数据表
增加数据:
篇幅限制,不贴改删的效果图了。
django rest framework是什么
Django REST framework(DRF)是一个建立在Django之上的强大且灵活的工具包,用于构建Web API。它遵循REST(Representational State Transfer)设计风格,允许你以最小的网络开销构建可扩展的、可维护的API。
我的理解它就是一个写网页接口的工具
基于django的开发步骤
1、首先创建django项目和应用
2、注册应用(给应用备案)
3、写模型(类似于数据结构格式化,后续只要输入相应格式的数据即可)
4、创建数据库
5、序列化(指定将输入/输出的数据转换成想要的格式)
6、视图(定义对数据的操作,包括post/get等)
7、路由(注册访问路径)
步骤 1: 创建Django项目和应用
首先,确保你已经安装了Django和Django REST framework。如果还没有安装,可以使用pip进行安装:
pip install django djangorestframework
然后,创建一个新的Django项目和一个应用:(一个django项目下可以有很多个应用)
django-admin startproject 项目名
cd 项目名
python manage.py startapp 应用名
步骤 2: 注册应用
settings.py
中就是项目的一些设置,需要将应用添加到已安装APP中:
在项目名/settings.py
中,添加应用名
应用到INSTALLED_APPS
中:(相当于对应用登记备案)
INSTALLED_APPS = [
...
'rest_framework',
'应用名',
]
步骤 3: 定义模型
后端主要处理数据,所以需要对数据进行格式化,(即规定一个表格有哪些属性,比如名字,身份证号等)。本文需要一个父表联两个子表,故需设置一个主键(唯一标识符:primary_key=True),需要将两个子表与父表通过外键进行级联。
在应用名/models.py
中定义数据模型:
from django.db import models
class Parent(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=100)
is_delete = models.IntegerField(default=0, blank=False, null=False)
def __str__(self):
return self.name
class ChildA(models.Model):
parent = models.ForeignKey(Parent, on_delete=models.CASCADE, related_name='child_a_set')
detail_a = models.CharField(max_length=100)
def __str__(self):
return self.detail_a
class ChildB(models.Model):
parent = models.ForeignKey(Parent, on_delete=models.CASCADE, related_name='child_b_set')
detail_b = models.CharField(max_length=100)
def __str__(self):
return self.detail_b
步骤 4: 创建数据库
然后运行迁移来创建数据库表:(感觉是根据数据结构生成excel表,首行即为属性那种意思)
python manage.py makemigrations
python manage.py migrate
步骤 5: 创建序列化器
感觉序列化器就是对输入输出数据做出一定的标准化,输出JSON格式/对输入JSON数据进行实例化,其中create函数和update函数涉及到保存数据和更新数据时的操作。
本任务中需要注意两个表的嵌套及新建和更新数据时函数的逻辑
在应用名/serializers.py
中创建数据的序列化器:
from rest_framework import serializers
from .models import *
class ChildASerializer(serializers.ModelSerializer):
class Meta:
model = ChildA
fields = ('id', 'detail_a')
# fields = '__all__' # 序列化所有字段
class ChildBSerializer(serializers.ModelSerializer):
class Meta:
model = ChildB
fields = ('id', 'detail_b')
# fields = '__all__' # 序列化所有字段
class ParentSerializer(serializers.ModelSerializer):
child_a_set = ChildASerializer(many=True, read_only=False)
child_b_set = ChildBSerializer(many=True, read_only=False)
def create(self, validated_data):
#对数据做格式化读取
child_a_data = validated_data.pop('child_a_set', [])
child_b_data = validated_data.pop('child_b_set', [])
parent = Parent.objects.create(**validated_data)
for child_a_item in child_a_data:
ChildA.objects.create(parent=parent, **child_a_item)
for child_b_item in child_b_data:
ChildB.objects.create(parent=parent, **child_b_item)
return parent
def update(self, instance, validated_data):
#对数据做格式化读取
return instance
class Meta:
model = Parent
fields = ('id', 'name', 'child_a_set', 'child_b_set') # 根据实际字段调整
步骤 6: 编写视图集
对数据进行增删改查等操作时需要自定义操作的函数
在应用名/views.py
中,使用视图集来定义API的逻辑:
class BaseView(APIView):
def get(self, request, *args, **kwargs):
pk = kwargs.get('pk', None)
if pk:
try:
data_list = Parent.objects.get(id=pk, is_delete=0)
ser = ParentSerializer(instance=data_list)
# 这里可以添加额外的视图方法,如自定义的action等
步骤 7: 配置URL路由
感觉就是定义网页访问路径
在应用名/urls.py
中设置应用的URL模式(如果文件不存在,请创建它):
from django.urls import path, include
from rest_framework.routers import DefaultRouter
from .views import 视图.py
urlpatterns = [
path('',BaseView.as_view(), name='mytest1'),
]
然后,在项目名/urls.py
中包含应用的URL:
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('api/rule', BaseView.as_view(), name='mytest2'),
path('api/rule/<int:pk>', BaseView.as_view(), name='mytest3'),
]
步骤 8: 运行项目
现在,可以运行Django项目了:
python manage.py runserver
现在,你可以通过访问http://127.0.0.1:8000/api/rule/
来查看数据列表,或者通过curl等命令使用POST请求来创建新数据,我使用的是postman来发送curl命令。
总结
使用使用Django REST framework构建包含父表和子表的API,其实感觉主要就两个部分,一个部分是django rest framework,这个教程网上有很多;还有一个就是实现包含父表和两个子表的数据模型构建,这个可能麻烦一些。
欢迎各位探讨,有不足之处请及时指出,本人将会考虑修改。
本人承接各种计算机项目,欢迎联系。私信即可