django之数据库表的单表查询
一、添加表记录
对于单表有两种方式
# 添加数据的两种方式
# 方式一:实例化对象就是一条表记录
Frank_obj = models.Student(name ="海东",course="python",birth="2000-9-9",fenshu=80)
Frank_obj.save()
# 方式二:
models.Student.objects.create(name ="海燕",course="python",birth="1995-5-9",fenshu=88)
二、查询表记录
查询相关API
# 查询相关API
# 1、all():查看所有
student_obj = models.Student.objects.all()
print(student_obj) #打印的结果是QuerySet集合
# 2、filter():可以实现且关系,但是或关系需要借助Q查询实现。。。
# 查不到的时候不会报错
print(models.Student.objects.filter(name="Frank")) #查看名字是Frank的
print(models.Student.objects.filter(name="Frank",fenshu=80)) #查看名字是Frank的并且分数是80的
# 3、get():如果找不到就会报错,如果有多个值,也会报错,只能拿有一个值的
print(models.Student.objects.get(name="Frank")) #拿到的是model对象
print(models.Student.objects.get(nid=2)) #拿到的是model对象
# 4、exclude():排除条件
print( models.Student.objects.exclude(name="海东")) #查看除了名字是海东的信息
# 5、values():是QuerySet的一个方法 (吧对象转换成字典的形式了,)
print(models.Student.objects.filter(name="海东").values("nid","course")) #查看名字为海东的编号和课程
#打印结果:<QuerySet [{'nid': 2, 'course': 'python'}, {'nid': 24, 'course': 'python'}]>
# 6、values_list():是queryset的一个方法 (吧对象转成元组的形式了)
print(models.Student.objects.filter(name="海东").values_list("nid", "course"))
#打印结果:< QuerySet[(2, 'python'), (24, 'python')] >
# 7、order_by():排序
print(models.Student.objects.all().order_by("fenshu"))
# 8、reverse():倒序
print(models.Student.objects.all().reverse())
# 9、distinct():去重(只要结果里面有重复的)
print(models.Student.objects.filter(course="python").values("fenshu").distinct())
# 10、count():查看有几条记录
print(models.Student.objects.filter(name="海东").count()) # 11、first()
# 12、last()
return render(request,"test.html",{"student_obj":student_obj})
# 13、esits:查看有没有记录,如果有返回True,没有返回False
# 并不需要判断所有的数据,
# if models.Book.objects.all().exists():
双下划线之单表查询
models.Tb1.objects.filter(id__lt=10, id__gt=1) # 获取id小于1 且 大于10的值 models.Tb1.objects.filter(id__in=[11, 22, 33]) # 获取id等于11、22、33的数据
models.Tb1.objects.exclude(id__in=[11, 22, 33]) # not in models.Tb1.objects.filter(name__contains="ven") #包括ven的
models.Tb1.objects.filter(name__icontains="ven") # icontains大小写不敏感 models.Tb1.objects.filter(id__range=[1, 2]) # 范围bettwen and startswith,istartswith, endswith, iendswith
对象可以调用自己的属性,用一个点就可以
还可以通过双下划线。。。
models.Book.objects.filter(price__gt=100) 价格大于100的书
models.Book.objects.filter(author__startwith= "张") 查看作者的名字是以张开头的
主键大于5的且小于2
price__gte=99大于等于
publishDate__year =2017,publishDate__month = 10 查看2017年10月份的数据
待续。。。。。。。。。
三、修改表记录
注意:
<1> 第二种方式修改不能用get的原因是:update是QuerySet对象的方法,get返回的是一个model对象,它没有update方法,而filter返回的是一个QuerySet对象(filter里面的条件可能有多个条件符合,比如name='alvin',可能有两个name='alvin'的行数据)。
<2>在“插入和更新数据”小节中,我们有提到模型的save()方法,这个方法会更新一行里的所有列。 而某些情况下,我们只需要更新行里的某几列。
此外,update()方法对于任何结果集(QuerySet)均有效,这意味着你可以同时更新多条记录update()方法会返回一个整型数值,表示受影响的记录条数。
注意,这里因为update返回的是一个整形,所以没法用query属性;对于每次创建一个对象,想显示对应的raw sql,需要在settings加上日志记录部分
四、删除表记录
删除方法就是 delete()。它运行时立即删除对象而不返回任何值。例如:e.delete()
def delstudent(request,id):
# 删除数据
models.Student.objects.filter(nid=id).delete()
return redirect("/test/")
你也可以一次性删除多个对象。每个 QuerySet 都有一个 delete() 方法,它一次性删除 QuerySet 中所有的对象。
例如,下面的代码将删除 pub_date 是2005年的 Entry 对象:
Entry.objects.filter(pub_date__year=2005).delete()
要牢记这一点:无论在什么情况下,QuerySet 中的 delete() 方法都只使用一条 SQL 语句一次性删除所有对象,而并不是分别删除每个对象。如果你想使用在 model 中自定义的 delete() 方法,就要自行调用每个对象的delete 方法。(例如,遍历 QuerySet,在每个对象上调用 delete()方法),而不是使用 QuerySet 中的 delete()方法。
在 Django 删除对象时,会模仿 SQL 约束 ON DELETE CASCADE 的行为,换句话说,删除一个对象时也会删除与它相关联的外键对象。例如:
b = Blog.objects.get(pk=1)
# This will delete the Blog and all of its Entry objects.
b.delete()
要注意的是: delete() 方法是 QuerySet 上的方法,但并不适用于 Manager 本身。这是一种保护机制,是为了避免意外地调用 Entry.objects.delete() 方法导致 所有的 记录被误删除。如果你确认要删除所有的对象,那么你必须显式地调用:
Entry.objects.all().delete()
五、编辑表格中的内容的涉及到的语法
编辑操作涉及到的语法 分析:
1、点击编辑,让跳转到另一个页面,拿到我点击的那一行
两种取id值的方式
方式一:
利用数据传参数(作为数据参数传过去了)
<a href="/edit/?book_id = {{book_obj.nid}}"></a> #相当于发了一个键值对
url里面就不用写匹配的路径了,
id = request.GET.get("book_id") #取值 方式二:
利用路径传参,得在url里面加上(\d+),就得给函数传个参数,无名分组从参数里面取值
<a href="/{{book_obj.nid}}"></a> 2、拿到id,然后在做筛选
id = request.GET.get("book_id")
book_obj = models.Book.objects.filter(nid=id) #拿到的是一个列表对象
注意:
1.取[0]就拿到对象了,,然后对象.属性就可以取到值了
2.用get,你取出来的数据必须只有一条的时候,,如果有多条用get就会报错,,,但是用get就不用加[0]了
book_obj = models.Book.objects.filter(nid=id)[0] 3、当点击编辑的时候怎么让input框里显示文本内容
value = "{{book_obj.title}}"
4、改完数据后重新提交
当提交的时候走action...../edit/}
隐藏一个input,
<input type="hidden" name = "book_id" value="{{book_obj.nid}}">
判断post的时候:
修改数据
方式一:save(这种方式效率是非常低的,不推荐使用,了解就行了)
修改的前提是先取(拿到要编辑的id值)
id = request.POST.get("book_id")
bk_obj = models.Book.objects.filter(nid=id)[0]
bk_obj.title = "hhhhhh" #这是写死了,不能都像这样写死了
bk_obj.save() 只要是用对象的这种都要.save
方式二:update
title = request.POST.get("title")
models.Book.objects.filter(nid=id).update(title=title,......)
跳转到index 如果是post请求的时候怎么找到id呢,
一、如果是数据传参:(也就是get请求的时候)
可以通过一个隐藏的input框,给这个框给一个name属性,value属性。通过request.POST.get("键"),,就可以得到id的值
二、如果是路径传参
可以通过传参的形式,当正则表达式写一个(\d+)的时候,就给函数传一个id,可通过这个id知道id.
django之数据库表的单表查询的更多相关文章
- MSSQL·备份数据库中的单表
阅文时长 | 0.11分钟 字数统计 | 237.6字符 主要内容 | 1.引言&背景 2.声明与参考资料 『MSSQL·备份数据库中的单表』 编写人 | SCscHero 编写时间 | 20 ...
- ActiveRecord-连接多张表之单表继承
ActiveRecord-连接多张表之单表继承 1. 基本概念 Rails提供了两种机制,可以将复杂的面向对象模型映射为关系模型,即所谓的单表继承(single-table inheritance)和 ...
- Django框架----数据库表的单表查询
一.添加表记录 对于单表有两种方式 # 添加数据的两种方式 # 方式一:实例化对象就是一条表记录 Frank_obj = models.Student(name ="海东",cou ...
- django(七)之数据库表的单表-增删改查QuerySet,双下划线
https://www.cnblogs.com/haiyan123/p/7738435.html https://www.cnblogs.com/yuanchenqi/articles/6083427 ...
- Django学习笔记--数据库中的单表操作----增删改查
1.Django数据库中的增删改查 1.添加表和字段 # 创建的表的名字为app的名称拼接类名 class User(models.Model): # id字段 自增 是主键 id = models. ...
- python实现简易数据库之二——单表查询和top N实现
上一篇中,介绍了我们的存储和索引建立过程,这篇将介绍SQL查询.单表查询和TOPN实现. 一.SQL解析 正规的sql解析是用语法分析器,但是我找了好久,只知道可以用YACC.BISON等,sqlit ...
- 数据库——SQL数据单表查询
数据查询 语句格式 SELECT [ALL|DISTINCT] <目标列表达式> [,<目标列表达式>] … FROM <表或视图名>[,<表或视图名&g ...
- Django学习——Django测试环境搭建、单表查询关键字、神奇的双下划线查询(范围查询)、图书管理系统表设计、外键字段操作、跨表查询理论、基于对象的跨表查询、基于双下划线的跨表查询
Django测试环境搭建 ps: 1.pycharm连接数据库都需要提前下载对应的驱动 2.自带的sqlite3对日期格式数据不敏感 如果后续业务需要使用日期辅助筛选数据那么不推荐使用sqlite3 ...
- MySQL数据库篇之单表查询
主要内容: 一.单表查询的语法 二.关键字的执行优先级 三.简单查询 四.where约束 五.分组查询 group by 六.having过滤 七.查询排序 order by 八.限制查询的记录数 l ...
随机推荐
- windows Apache 环境下配置支持HTTPS的SSL证书
windows Apache 环境下配置支持HTTPS的SSL证书 1.准备工作 1)在设置Apache + SSL之前, 需要做: 安装Apache, 下载安装Apache时请下载带有SSL版本的A ...
- react路由的安装及格式和使用方法
react路由的安装: 在要创建项目的目录命令窗里输入: cnpm install -g create-react-app create-react-app 项目名 在创建好的项目目录命令窗里输入: ...
- cmd关闭被占用的端口命令及教程详解
//关闭端口占用命令eg:1. netstat -nao | findstr “8080” 查询8080端口2. taskkill /pid 3017 /F 关闭pid为3017的进程 //详解 ↓但 ...
- Python Django CBV下的通用视图函数
ListView TemplateView DetailView 之前的代码实例基本上都是基于FBV的模式来撰写的,好处么,当然就是简单粗暴..正如: def index(request): retu ...
- JS 如何将 HTML 页面导出为多页 PDF
参考链接:https://blog.csdn.net/pwc1996/article/details/70141383
- Light oj 1018 - Brush (IV) 状态压缩
题目大意: 给出n个点的坐标,求至少画多少掉直线才能连接所有点. 题目思路:状态压缩 首先经行预处理,求出所有状态下,那些点不在该状态内 以任意两点为端点求出这条直线的状态 枚举所有状态,找出不在当前 ...
- 3. Python 字典 常用办法总结
Python字典客储存任意类型的对象,如字符串.数字.元祖.列表.字典.bool等. 优点:取值方便,速度快 1.创建字典 字典由键(key)和对应值(value)成对组成. 字典也被称作关联数组或哈 ...
- ES6学习笔记五(promise异步)
知识点1:rosolve是执行下一步then() // Promise { let ajax=function(){ console.log('执行2'); return new Promise(fu ...
- Cent os 6.8添加中文字体
作者:邓聪聪 Cent os 6.8添加中文字体的相关步骤: [root@bogon ]#yum -y install fontconfig #yum安装fontconfig [root@bogon ...
- 消息队列:JMS之基本概念介绍
摘要:The Java Message Service (JMS) API is a messaging standard that allows application components bas ...