これを学習した後、Django の基本的な使い方とデータの操作について学びました。インターフェース データの追加、削除、変更、クエリの 2 つの記述方法は次のとおりです。
書き方1:
サブアプリケーションルーティングテーブル urls.py
urlpatterns = [
# path('admin/', admin.site.urls),
path('index1/', index1),
path('index1/', views.index1),
re_path('^index2/$', index2),
#类视图路由的定义,views.类视图.as_view(),as_view必须要加括号,不然后面运行会有报错
path('index4/',views.MyView.as_view()),
# 冒号前面:内置转化器(int、slug、uuid等)
# 冒号后面:路径参数名
path('index4/<int:pk>/',views.MyView.as_view())
]
モデルクラス models.py
class ProjectsModel(BaseModel):
# 设置id为主键
id = models.AutoField(primary_key=True, verbose_name="id主键", help_text="id主键")
name=models.CharField(unique=True,max_length=200,verbose_name="项目名",help_text="项目名")
leader=models.CharField(max_length=20,verbose_name="负责人",help_text="负责人")
tester=models.CharField(max_length=20,verbose_name="测试负责人",help_text="测试负责人")
programmer=models.CharField(max_length=50,verbose_name="开发人员",help_text="开发人员")
publish_app=models.CharField(max_length=100,verbose_name="发布应用",help_text="发布应用")
desc=models.TextField(max_length=200,verbose_name="简要描述",help_text="简要描述",blank=True,null=True,default="")
class Meta:
db_table = 'tb_projects'
verbose_name = '项目信息'
verbose_name_plural = verbose_name
def __str__(self):
return self.name
ビューセット views.py
インターフェイスを設計するとき、データの追加、削除、変更、クエリに応じて、さまざまなリクエスト メソッドがマッピングされます。
新しいデータ------>ポストリクエスト、入力パラメータはjson形式のデータです
データの削除------>削除リクエスト、入力パラメータはプロジェクトIDです
データの変更------>putリクエスト。更新するIDと属性値を渡すことができます
すべてのデータをクエリ----->リクエストを取得
指定されたIDのデータをクエリ -------> リクエストを取得
class MyView(View):
def get(self, request, pk=None):
# 查询数据
# data=ProjectsModel.objects.get(id=1)
if pk != None:
data_query = ProjectsModel.objects.get(pk=pk)
# data_query=dict(data_query)
data_list = []
data_dic = {
"id": data_query.id,
"project_name": data_query.name,
"tester": data_query.tester,
"leader": data_query.leader,
"publish_app": data_query.publish_app
}
data_list.append(data_dic)
data_str = json.dumps(data_list, ensure_ascii=False)
return HttpResponse(data_str, content_type="application/json")
else:
data_query = ProjectsModel.objects.all()
data_list = []
for obj in data_query:
data_dic = {
"id": obj.id,
"name": obj.name,
"tester": obj.tester
}
data_list.append(data_dic)
# data_query=list(data_query)
data_str = json.dumps(data_list, ensure_ascii=False)
return HttpResponse(data_str, content_type="application/json")
# data=ProjectsModel.objects.filter(id__gte=2)
# return JsonResponse(data_query, safe=False)
# data_qs=ProjectsModel.objects.filter(name__contains="项目").exclude(desc__startswith="1没有")
# data_qs=ProjectsModel.objects.filter(Q(name__contains="项目")|Q(desc__startswith="1没有"))
# data_qs=ProjectsModel.objects.filter(interfacesmodel__tester="测试人1")
# data_qs=ProjectsModel.objects.filter(interfacesmodel__tester__endswith="1")
# data_qs = InterfacesModel.objects.filter(project__name__contains="项目")
# data_list = []
# for obj in data_qs:
# data_dic = {
# "id": obj.id,
# "name": obj.name,
# "tester": obj.tester
# }
# data_list.append(data_dic)
# return JsonResponse(data_list, safe=False)
def post(self, request):
# 视图函数和类视图中的请求方法,一定要返回HttpResponse对象或者子类对象
# a.第一个参数为content,需要传递响应数据(类型为字符串或者字节类型)
# b.可以使用content_type关键字参数来指定响应报文类型(text/html、application/json等等)
# c.可以使用status关键字参数来指定响应状态码
# 创建数据
# 方法一:
# data=ProjectsModel(name="是个名字a a ",leader="测试leader",tester="测试人",programmer="五星开发",publish_app="发布应用",desc="没有描述信息")
# data.save()
# 方法二:
# data=ProjectsModel.objects.create(name="是个名字a a ",leader="测试leader",tester="测试人",programmer="五星开发",publish_app="发布应用",desc="没有描述信息")
body_byte_data = request.body.decode()
body_str_data = json.dumps(body_byte_data, ensure_ascii=False)
data_dic = eval(json.loads(body_str_data))
create_data = ProjectsModel.objects.create(**data_dic)
return HttpResponse(create_data, content_type="application/json", status=200)
def put(self, request, pk):
# 场景一:
# 通过id搜索出来对应的数据,并修改指定id的数据
query_data = ProjectsModel.objects.get(pk=pk)
# # 读取输入的json数据转化为dic类型
body_byte_data = request.body.decode()
body_str_data = json.dumps(body_byte_data, ensure_ascii=False)
data_dic = eval(json.loads(body_str_data))
# # 更新对应的字段
query_data.name = data_dic["name"]
query_data.leader = data_dic["leader"]
query_data.tester = data_dic["tester"]
query_data.programmer = data_dic["programmer"]
query_data.publish_app = data_dic["publish_app"]
query_data.desc = data_dic["desc"]
query_data.save()
return HttpResponse("PUT请求,修改数据成功")
# 场景二:
# query_data = ProjectsModel.objects.filter(id=pk).update(leader="hahahha")
# update_data={
# "name":query_data.name
# }
# return HttpResponse("PUT请求,update修改数据成功")
def delete(self, request, pk):
dele_data = ProjectsModel.objects.get(pk=pk)
dele_data.delete()
return HttpResponse("DELETE删除成功")
postman を使用したデバッグ
すべてのデータをクエリします。
指定されたデータをクエリする
データを作成する
データを変更する
データを削除します:
この方法の主な特徴は次のとおりです。
- ビュークラスを共有する
- 完全なクエリと部分的なクエリの組み合わせ
後でインターフェースに基づいて関数ロジックを追加する必要がある場合、インターフェース要求の互換性を考慮することがますます困難になり、保守が不便になります。
書き方2:(推奨)
プロジェクトルーティングテーブル:
ここではルーティング パスを変更しました。
pk を渡す必要がある場合は、pk 値に応じて削除、変更、検索など、クラス名 ProjectsDetailViews で pk を見つけるように指定します。
pk を渡す必要がない場合は、新しいデータや完全なクエリなど、クラス名 ProjectsViews で検索するように指定します。
urlpatterns = [
path('projects/',views.ProjectsViews.as_view()),
path('projects/<int:pk>/',views.ProjectsDetailViews.as_view())
]
プロジェクト ビューセット ファイル:
class ProjectsDetailViews(View):
# 查询指定pk的数据
def get(self, request, pk):
ret = {
"msg": "传参异常",
"code": 404
}
try:
query_data = ProjectsModel.objects.get(pk=pk)
# 如果入参是不存在的id数据,抛出异常
except Exception:
return JsonResponse(ret, json_dumps_params={"ensure_ascii": False}, status=404)
data_dict = {
"id": query_data.id,
"name": query_data.name,
"leader": query_data.leader
}
return JsonResponse(data_dict, json_dumps_params={"ensure_ascii": False}, status=200)
# 更新数据
def put(self, request, pk):
ret = {
"msg": "传参异常",
"code": 404
}
try:
#查出对应id的数据
query_data=ProjectsModel.objects.get(pk=pk)
#提取传入的参数
data_str=request.body.decode('utf-8')
data_dict=json.loads(data_str)
#修改老数据,传入新数据给对应字段
query_data.name=data_dict["name"]
query_data.leader=data_dict["leader"]
query_data.desc=data_dict["desc"]
except Exception:
return JsonResponse(ret, json_dumps_params={"ensure_ascii": False}, status=200)
#保存更新的数据
query_data.save()
#输出战展示数据
data_dict = {
"id": query_data.id,
"name": query_data.name,
"leader": query_data.leader
}
return JsonResponse(data_dict,json_dumps_params={"ensure_ascii":False},status=200)
# 删除数据
def delete(self, request, pk):
ret={
"msg":"删除成功!"
}
ret_error = {
"msg": "传参异常",
"code": 404
}
try:
# 根据id查出对应数据
query_data = ProjectsModel.objects.get(pk=pk)
#删除指定数据
query_data.delete()
#一般删除数据的输出为None
except Exception:
return JsonResponse(ret_error,json_dumps_params={"ensure_ascii":False},status=200)
return JsonResponse(ret,json_dumps_params={"ensure_ascii":False},status=200)
class ProjectsViews(View):
# 查询全部数据
def get(self, request):
pro_data=ProjectsModel.objects.all()
pro_list=[]
for pro in pro_data:
pro_dict={
"id": pro.id,
"name": pro.name,
"leader": pro.leader
}
pro_list.append(pro_dict)
return JsonResponse(pro_list,safe=False, json_dumps_params={"ensure_ascii": False}, status=200)
# 创建数据
def post(self, request):
ret = {
"msg": "传参异常",
"code": 404
}
try:
json_str = request.body.decode('utf-8')
data_dict=json.loads(json_str)
#如果入参不是json格式数据,抛出异常
except json.JSONDecodeError:
return JsonResponse(ret,json_dumps_params={"ensure_ascii": False}, status=404)
create_data=ProjectsModel.objects.create(**data_dict)
create_data.save()
pro_dict = {
"id": create_data.id,
"name": create_data.name,
"leader": create_data.leader
}
return JsonResponse(pro_dict,json_dumps_params={"ensure_ascii": False}, status=200)