文章目录
- 1. 模型的创建
- 2. 路由系统的创建
- 3. 添加数据的接口
- 4. 获取所有数据的接口
- 5. 获取单条数据的接口
- 6. 更新数据的接口
- 7. 删除数据的接口
创建模型用于测试,设计一张简单的数据表存放在Pycharm自带的sqlite数据库中:
models.py
from django.db import models
# Create your models here.
class User(models.Model):
name = models.CharField(max_length=12)
register_date = models.DateTimeField(auto_now_add=True, null=True) # 如果设置为自动设置时间,要添加可以为空,默认是不为空的
生成数据表:
(DjangoAPI) thanlon@thanlon:~/PycharmProjects/DjangoAPI$ python manage.py makemigrations
(DjangoAPI) thanlon@thanlon:~/PycharmProjects/DjangoAPI$ python manage.py migrate
添加和查询信息使用的路由是 user/
,修改(更新)和删除信息使用路由是 user/
,路由创建如下:
urls.py:
from django.contrib import admin
from django.urls import path
from app import views
urlpatterns = [
path('admin/', admin.site.urls),
path('user/', views.UserView.as_view()),
path('user//' , views.UserDetail.as_view()),
]
添加数据的业务逻辑:
views.py:
class UserView(View):
def post(self, request):
"""
增加数据
:param request:
:return:
"""
# request.POST中是没有数据的,需要在body中获取,但是需要先将bytes->符串->反序列化转化成列表对象
form = UserForm(None, json.loads(request.body.decode()))
if form.is_valid():
instance = form.save()
ret = {
'status': 0,
'data': instance.pk
}
return JsonResponse(ret)
else:
ret = {
'status': 1,
'data': form.errors
}
return JsonResponse(ret)
数据验证:
user_form.py:
from django import forms
from .. import models
class UserForm(forms.Form):
name = forms.CharField(max_length=10)
def __init__(self, instence=None, *args, **kwargs): # 函数传参不要使用可变类型
self.instence = instence
super(UserForm, self).__init__(*args, **kwargs) # 原封不动传过去,这样就可以多传递一个值
def save(self):
if self.instence:
# 通过反射设置新值,不能直接self.instence.name='thanlon'
# print(self.cleaned_data)
for k, v in self.cleaned_data.items():
setattr(self.instence, k, v)
self.instence.save()
return self.instence # 更新instence
# 如果没有数据。校验通过的数据全部放在cleaned_data中,key value组成的字典:{'name': 'thanlon'}
return models.User.objects.create(**self.cleaned_data)
添加和修改数据,因为需要有数据传入后台,所以需要对数据进行验证。查询所有数据因为不传入后台任何数据,也无须验证。查询单条数据和删除数据需要进行验证,但不是Form验证,使用路由匹配进行验证!
Postman向后台发送添加数据的POST请求,返回的状态码是0
,说明添加成功:
验证数据库,已经添加完成:
获取所有数据的业务逻辑:
class UserView(View):
def get(self, request):
"""
查询(所有数据)
:param request:
:return:
"""
query_set = models.User.objects.values('name') #
ret = {
'status': 0,
'data': list(query_set) # 转换成列表,[{'name': 'Erics'}]
}
return JsonResponse(ret)
Postman向后台发送获取所有数据的GET请求,返回的状态码是0
,说明查询数据成功:
获取单条数据的业务逻辑,走的路由是 /user/
:
views.py:
class UserDetail(View):
def get(self, request, pk):
"""
查询单条数据
:param request:
:param pk:
:return:
"""
# instence = models.User.objects.filter(pk=pk)
# print(instence) # ]>
instence = models.User.objects.filter(pk=pk).first()
print(instence) # User object (1)
ret = {
'status': 0,
'data': {
'name': instence.name
}
}
return JsonResponse(ret)
Postman向后台发送查询单条数据的GET请求,返回的状态码是0
,说明添加成功:
更新数据的业务逻辑:
class UserDetail(View):
def put(self, request, pk):
"""
修改数据。restful规定更新数据,用put或者patch,put用得多一些
:param request:
:return:
"""
instence = models.User.objects.filter(pk=pk).first()
if not instence:
ret = {
'status': 1,
'data': {
'name': '数据不存在'
}
}
return JsonResponse(ret)
# 借助form来修改(form中有新数据),降低了耦合度
form = UserForm(instence, json.loads(request.body.decode()))
if form.is_valid():
instence = form.save() # instence不更新也是可以的,还是查找到的和要修改的id是一样的
ret = {
'status': 0,
'data': instence.pk
}
return JsonResponse(ret)
else:
ret = {
'status': 1,
'data': form.errors
}
return JsonResponse(ret)
数据的验证:
user_form.py:
from django import forms
from .. import models
class UserForm(forms.Form):
name = forms.CharField(max_length=10)
def __init__(self, instence=None, *args, **kwargs): # 函数传参不要使用可变类型
self.instence = instence
super(UserForm, self).__init__(*args, **kwargs) # 原封不动传过去,这样就可以多传递一个值
def save(self):
if self.instence:
# 通过反射设置新值,不能直接self.instence.name='thanlon'
# print(self.cleaned_data)
for k, v in self.cleaned_data.items():
setattr(self.instence, k, v)
self.instence.save()
return self.instence # 更新instence
# 如果没有数据。校验通过的数据全部放在cleaned_data中,key value组成的字典:{'name': 'thanlon'}
return models.User.objects.create(**self.cleaned_data)
Postman向后台发送更新数据的PUT请求,返回的状态码是0
,说明修改成功:
删除数据的业务逻辑:
views.py:
class UserDetail(View):
def delete(self, request, pk):
"""
删除数据(删除单条数据)
:param request:
:param pk:
:return:
"""
models.User.objects.filter(pk=pk).delete()
ret = {
'status': 0,
'data': []
}
return JsonResponse(ret)
user_form.py:
class UserForm(forms.Form):
name = forms.CharField(max_length=10)
def __init__(self, instence=None, *args, **kwargs): # 函数传参不要使用可变类型
self.instence = instence
super(UserForm, self).__init__(*args, **kwargs) # 原封不动传过去,这样就可以多传递一个值
def save(self):
if self.instence:
# 通过反射设置新值,不能直接self.instence.name='thanlon'
# print(self.cleaned_data)
for k, v in self.cleaned_data.items():
setattr(self.instence, k, v)
self.instence.save()
return self.instence # 更新instence
# 如果没有数据。校验通过的数据全部放在cleaned_data中,key value组成的字典:{'name': 'thanlon'}
return models.User.objects.create(**self.cleaned_data)
Postman向后台发送添加数据的 DELETE请求
,返回的状态码是0,说明删除成功:
Github:https://github.com/ThanlonSmith/django-api