1. 模型的創建
創建模型用於測試,設計一張簡單的數據表存放在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
2. 路由系統的創建
添加和查詢信息使用的路由是 user/
,修改(更新)和刪除信息使用路由是 user/<int:pk>/
,路由創建如下:
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/<int:pk>/', views.UserDetail.as_view()),
]
3. 添加數據的接口
添加數據的業務邏輯:
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
,說明添加成功:
驗證數據庫,已經添加完成:
4. 獲取所有數據的接口
獲取所有數據的業務邏輯:
class UserView(View):
def get(self, request):
"""
查詢(所有數據)
:param request:
:return:
"""
query_set = models.User.objects.values('name') # <QuerySet [{'name': 'Erics'}]>
ret = {
'status': 0,
'data': list(query_set) # 轉換成列表,[{'name': 'Erics'}]
}
return JsonResponse(ret)
Postman向後臺發送獲取所有數據的GET請求,返回的狀態碼是0
,說明查詢數據成功:
5. 獲取單條數據的接口
獲取單條數據的業務邏輯,走的路由是 /user/<int:pk>/
:
views.py:
class UserDetail(View):
def get(self, request, pk):
"""
查詢單條數據
:param request:
:param pk:
:return:
"""
# instence = models.User.objects.filter(pk=pk)
# print(instence) # <QuerySet [<User: User object (1)>]>
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
,說明添加成功:
6. 更新數據的接口
更新數據的業務邏輯:
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
,說明修改成功:
7. 刪除數據的接口
刪除數據的業務邏輯:
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,說明刪除成功: