Django学习笔记之View操作指南

作者:三省吾身 时间:2023-05-29 14:08:47 

Django的View

一个视图函数(类),简称视图,是一个简单的Python 函数(类),它接受Web请求并且返回Web响应。响应可以是一张网页的HTML内容,一个重定向,一个404错误,一个XML文档,或者一张图片。 

无论视图本身包含什么逻辑,都要返回响应。代码写在哪里也无所谓,只要它在你当前项目目录下面。除此之外没有更多的要求了——可以说“没有什么神奇的地方”。为了将代码放在某处,大家约定成俗将视图放置在项目(project)或应用程序(app)目录中的名为views.py的文件中。

导入:from django.views import View

一、查询所有数据

查询数据在自定义的视图类中定义get方法

使用django.http模块中的JsonResponse对非json格式的数据做返回处理

在JsonResponse必须添加safe=False参数,否则会报错:In order to allow non-dict objects to be serialized set the safe


from django.http import HttpResponse
from django import http
# Create your views here.
class UserView(View):
''' 用户视图 '''
def get(self, request):
 # 模型类实例化对象
 users = UserProfile.objects.all()
 user_list = []
 for user in users:
  user_dict = {
   'id': user.id,
   'username': user.username,
   'password': user.password,
   'open_id': user.open_id,
   'code': user.code
  }
 user_list.append(user_dict)
 return http.JsonResponse(user_list)

二、创建数据

使用django中的json,把前端传递过来的json数据转成字典

使用django.db.models模块中的Q来查询多个字段在数据库中是否存在


from django.views import View
from django.http import HttpResponse
from django import http
from django.db.models import Q
import json
class UserView(View):
''' 用户视图 '''
def post(self, request):
 # 获取数据, json转字典
 dict_data = json.loads(request.body.decode())
 print(dict_data)
 nick_name = dict_data.get('nickName')
 code = dict_data.get('code')
 open_id = "xljsafwjeilnvaiwogjirgnlg"
 # 校验数据
 result = UserProfile.objects.filter(Q(code=code) | Q(open_id=open_id))
 if not result.exists():
  # 数据入库
  user = UserProfile.objects.create( username=nick_name, open_id=open_id, code=code )
  # 返回响应
  user_dict = {
   'id': user.id,
   'username': user.username,
   'password': user.password,
   'open_id': user.open_id,
   'code': user.code
  }
  return http.JsonResponse(user_dict)
 return http.JsonResponse("用户已存在", safe=False, status=202)

三、查询某一条数据(单个)

前端需要传递pk/id值,通过pk/id查询数据,查询一条数据必须用get,不能用filter,否则会报错:AttributeError: 'QuerySet' object has no attribute 'id'

数据转换

返回响应


class UserProfileDetail(View):
''' 详情视图 '''
def get(self, request):
 userInfo = UserProfile.objects.get(id=id)
 if not userInfo:
  return HttpResponse("查询的用Info户不存在", status=404)    
 user_dict = {
  'id': userInfo.id,
  'username': userInfo.username,
  'password': userInfo.password,
  'open_id': userInfo.open_id,
  'code': userInfo.code
 }
 return http.JsonResponse(user_dict, status=200)

四、更新一条数据

前端需要传递pk/id值,通过pk/id查询数据,查询一条数据必须用get,不能用filter,否则会报错:AttributeError: 'QuerySet' object has no attribute 'id'

更新一条数据时必须使用filter来查询数据集,再使用update(**data)来更新数据,不能使用get,否则会报错:AttributeError: '模型类' object has no attribute 'update'

get查询获取到的是数据对象,而filter查询获取到的是数据集


class UserProfileDetail(View):
''' 详情视图 '''
def put(self, request, id):
 data_dict = json.loads(request.body.decode())
 userInfo = UserProfile.objects.get(id=id)
 if not userInfo:
  return HttpResponse("查询的用Info户不存在", status=404)    
 UserProfile.objects.filter(id=id).update(**data_dict)
 userInfo = UserProfile.objects.get(id=id)
 user_dict = {
  'id': userInfo.id,
  'username': userInfo.username,
  'password': userInfo.password,
  'open_id': userInfo.open_id,
  'code': userInfo.code
 }
 return http.JsonResponse(user_dict, status=200)

五、删除某一条数据


class UserProfileDetail(View):
''' 详情视图 '''
def delete(self, request, id):
 userInfo = UserProfile.objects.filter(id=id)
 if not userInfo:
  return HttpResponse("删除的数据不存在", status=404)      
 UserProfile.objects.filter(id=id).delete()
 return HttpResponse("数据删除成功", status=204)

上述的操作只能适用于数据表中字段很少的情况,如果字段较多,写起来会很麻烦,不利于开发

总结

来源:https://segmentfault.com/a/1190000039646191

标签:django,view,操作
0
投稿

猜你喜欢

  • Python中的Socket 与 ScoketServer 通信及遇到问题解决方法

    2021-02-01 04:08:12
  • Python获取女友聊天记录详细流程

    2022-06-29 21:38:19
  • 浅谈python中的实例方法、类方法和静态方法

    2022-02-10 07:11:27
  • php初始化对象和析构函数的简单实例

    2023-11-09 18:11:14
  • go语言实现一个最简单的http文件服务器实例

    2024-02-21 21:52:41
  • Python之用户输入的实例

    2022-09-06 13:22:18
  • 简单了解django缓存方式及配置

    2022-11-20 05:04:17
  • JS实现DOM节点插入操作之子节点与兄弟节点插入操作示例

    2024-04-22 22:35:27
  • Python多线程同步Lock、RLock、Semaphore、Event实例

    2023-08-03 20:47:15
  • Python基于多线程操作数据库相关问题分析

    2024-01-26 05:18:21
  • MYSQL删除重复数据的简单方法

    2024-01-20 17:00:21
  • Mysql Workbench查询mysql数据库方法

    2024-01-27 19:18:54
  • 简单介绍Python中的round()方法

    2023-05-01 11:57:10
  • python 容器总结整理

    2021-03-20 16:52:08
  • Python灰度变换中灰度切割分析实现

    2021-10-05 12:07:49
  • Golang中map的深入探究

    2024-04-26 17:23:35
  • 《JavaScript DOM 编程艺术》读书笔记之JavaScript 简史

    2024-04-10 16:13:23
  • executesql 存储过程

    2024-01-21 17:04:21
  • Python 序列化和反序列化库 MarshMallow 的用法实例代码

    2023-02-20 23:28:04
  • 基于Django静态资源部署404的解决方法

    2021-09-06 11:59:41
  • asp之家 网络编程 m.aspxhome.com