上篇带大家简单做了一下图书表的创建、简单的查看和删除,今天会先简单介绍添加和修改,因为添加和修改与删除一样都很简单,本篇会相对多介绍一点单表查询,大家都知道数据库中查询是最重要的一部分,毕竟无论是修改还是删除等很多操作都是建立在查数据的基础上。

本篇导航:

今天所有例子用的延续上篇的数据库,book表也是延续上篇,接着昨天的建表,删除等功能扩展其他功能,所以有所疑问的可以先看上篇随笔:

http://www.cnblogs.com/liluning/p/7729607.html

一、添加

1、添加表记录

1)方式一

book_obj = models.Book(nid=nid,title=title,author=author,publishDate=publishDate,price=price)
book_obj.save() # 将数据保存到数据库

2)方式二

#book_obj可以得到返回值
book_obj=models.Book.objects.create(title=title,author=author,publishDate=publishDate,price=price)

2、template模版

1)首页的添加按钮

<a href="/addBook/"><button class="btn btn-primary">添加书籍</button></a>

2)添加页面的提交表单

<form action="/add/" method="post">
{% csrf_token %}
<tr>
<td><input type="text" name="title"></td>
<td><input type="text" name="author"></td>
<td><input type="date" name="publishDate"></td>
<td><input type="text" name="price"></td>
<td>
<button class="btn btn-info">提交</button>
</td>
</tr>
</form>

{% csrf_token %}之前说过 安全机制 在post请求中使用

3、url 分发

url(r'^add/', views.addBook),

4、视图函数views

def addBook(request) :
if request.method == "POST" :
nid = request.POST.get("nid")
title = request.POST.get("title")
author = request.POST.get("author")
publishDate = request.POST.get("publishDate")
price = request.POST.get("price")
# book_obj = models.Book(title=title,author=author,publishDate=publishDate,price=price)
# book_obj.save() # 将数据保存到数据库
book_obj = models.Book.objects.create(title=title, author=author, publishDate=publishDate, price=price)
return redirect("/index/")
return render(request, "add.html")

先讲拿到表单提交的数据 然后添加到表

添加表用那一个方式都可以 推荐方式二


二、单表查询

1、查询相关API

一定区分object与querySet的区别

昨天已做介绍:
<1> all():
<2> filter(): <3> get():
返回与所给筛选条件相匹配的对象,返回结果有且只有一个,如果符合筛选条件的对象超过一个或者没有都会抛出错误。(慎用)
<4> exclude():
它包含了与所给筛选条件不匹配的对象
<5> values():
返回一个ValueQuerySet——一个特殊的QuerySet,运行后得到的并不是一系列model的实例化对象,而是一个可迭代的字典序列
<6> values_list():
它与values()非常相似,它返回的是一个元组序列,values返回的是一个字典序列
<7> order_by():
对查询结果排序
<8> reverse():
对查询结果反向排序
<9> distinct():
从返回结果中剔除重复纪录
<10> count():
返回数据库中匹配查询(QuerySet)的对象数量。
<11> first():
返回第一条记录
<12> last():
返回最后一条记录
<13> exists():
如果QuerySet包含数据,就返回True,否则返回False

例如: <2>filter(nid=nid,title=title) ','可以起到数据库and的作用两个条件关系为且,在括号里并不能实现‘或’的条件关系,后面的随笔会随后一一介绍。 

2、双下划线之单表查询

1 models.Tb1.objects.filter(id__lt=10, id__gt=1)    # 获取id大于1 且 小于10的值
#__lte,__gte 小于等于 大于等于
2 models.Tb1.objects.filter(id__in=[11, 22, 33]) # 获取id等于11、22、33的数据
3 models.Tb1.objects.exclude(id__in=[11, 22, 33]) # not in
4 models.Tb1.objects.filter(name__contains="ven") #模糊查询
5 models.Tb1.objects.filter(name__icontains="ven") # icontains大小写不敏感
6 models.Tb1.objects.filter(id__range=[1, 2]) # 范围bettwen and
7 startswith,istartswith, endswith, iendswith

3、通过logging可以查看翻译成的sql语句

LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
'console':{
'level':'DEBUG',
'class':'logging.StreamHandler',
},
},
'loggers': {
'django.db.backends': {
'handlers': ['console'],
'propagate': True,
'level':'DEBUG',
},
}
} 

将上面代码粘贴到setting配置文件里,当你的操作与数据库相关时 会将我们的写的语句翻译成sql语句在服务端打印。

4、以下代码只为测试sql语句和单表查询示例

1)url 分发

url(r'^query/', views.query),

2)视图函数views

def query(request):
# 查询方法API:
# 1 all: models.表名.objects.all()
# book_all = models.Book.objects.all() # 结果是querySet集合 [model对象,....]
# print(book_all) # <QuerySet [<Book: Book object>, <Book: Book object>, <Book: Book object>]> # 2 filter: models.表名.objects.filter() # 结果是querySet集合 [model对象,....]
# ret1=models.Book.objects.filter(author="yuan") # # <QuerySet [<Book: 追风筝的人>, <Book: asd>]>
# ret2=models.Book.objects.filter(nid=1) # <QuerySet [<Book: yuan>]>
# ret2=models.Book.objects.filter(author="yuan",price=123) # <QuerySet [<Book: yuan>]>
# print(ret2) # 3 get models.表名.objects.get() # model对象
# ret3=models.Book.objects.get(author="yuan")
# print(ret3.price) # exclude : 排除条件
# ret4=models.Book.objects.exclude(author="yuan")
# print(ret4) # values方法
# ret=models.Book.objects.filter(author="yuan").values("title","price")
# print(ret)# <QuerySet [{'title': '追风筝的人', 'price': Decimal('99.00')}, {'title': 'asd', 'price': Decimal('123.00')}]> # ret = models.Book.objects.filter(author="yuan").values_list("title", "price")
# print(ret) # <QuerySet [('追风筝的人', Decimal('99.00')), ('asd', Decimal('123.00'))]> # ret=models.Book.objects.filter(author="yuan").values("author").distinct()
# print(ret) # count方法
# ret=models.Book.objects.filter(author="yuan").count()
# print(ret) # first 方法
ret = models.Book.objects.all().first()
print(ret) # exists方法
# if models.Book.objects.all().exists():
# print("exists")
# else:
# print("nothing") # ret = models.Book.objects.filter(price__gt=100)
# ret = models.Book.objects.filter(price__gte=99) # 大于等于 # ret=models.Book.objects.filter(publishDate__year=2017,publishDate__month=10)
# ret=models.Book.objects.filter(author__startswith="张") # print(ret)
return HttpResponse("OK")

以 first 方法为例

从此处可以看出我们虽然在操作数据库时没有写sql语句,但是django将我们写的语句翻译成了sql语句


三、修改

1、修改表记录

修改表记录和添加表记录同样都有两个方法,我们在视图函数views里看修改表记录的具体应用

nid = request.POST.get("nid")
title=request.POST.get("title")
author=request.POST.get("author")
publishDate=request.POST.get("publishDate")
price=request.POST.get("price") # 修改方式1:save(效率低)
# book_obj=models.Book.objects.filter(nid=id)[0]
# 修改书名示例:
# book_obj.title="py2"
# book_obj.save() # 修改方式2:(推荐)
models.Book.objects.filter(nid=nid).update(title=title,author=author,publishDate=publishDate,price=price)
return redirect("/index/")

2、url 分发

url(r'^edit/(\d+)', views.editBook),

3、template模版

1)主页修改按钮

<a href="/edit/{{ book_obj.nid }}"><button class="btn btn-info">编辑</button></a>

2)数据来源和添加表数据相同 由template模版的form表单提交 不同的是修改的表单内需要默认原来的数据

<form action="/edit/{{ edit_obj.nid }}" method="post">
{% csrf_token %}
<tr>
<td>{{ forloop.counter}}<input type="hidden" name="nid" value="{{ edit_obj.nid }}"></td>
<td><input type="text" name="title" value="{{ edit_obj.title }}"></td>
<td><input type="text" name="author" value="{{ edit_obj.author }}"></td>
<td><input type="date" name="publishDate" value="{{ edit_obj.publishDate|date:"Y-m-d" }}"></td>
<td><input type="text" name="price" value="{{ edit_obj.price }}"></td>
<td>
<a href="/del/{{ edit_obj.nid }}"><input type="button" class="btn btn-danger" value="删除"></a>
<button class="btn btn-success">保存</button>
</td>
</tr>
</form>

65、django之模型层(model)--添加、单表查询、修改基础的更多相关文章

  1. Web框架之Django_05 模型层了解(单表查询、多表查询、聚合查询、分组查询)

    摘要: 单表查询 多表查询 聚合查询 分组查询 一.Django ORM 常用字段和参数: 常用字段:#AutoFieldint自增列,必须填入参数primary_key = True,当model中 ...

  2. Django 模版语法 测试环境 ORM单表查询

    模版语法 传值 视图函数向前端html页面传值,基本上所有的数据类型都可以渲染在前端页面上. views.py from django.shortcuts import render, redirec ...

  3. Django框架-模型层

    Django框架-模型层 一.单表查询之必知必会13条 1.时间字段中的两个关键性参数 create_time = models.DateField() # 年月日 create_time = mod ...

  4. django之模型层(model)--添加、单表查询、修改基础

    上篇带大家简单做了一下图书表的创建.简单的查看和删除,今天会先简单介绍添加和修改,因为添加和修改与删除一样都很简单,本篇会相对多介绍一点单表查询,大家都知道数据库中查询是最重要的一部分,毕竟无论是修改 ...

  5. 64、django之模型层(model)--建表、查询、删除基础

    要说一个项目最重要的部分是什么那铁定数据了,也就是数据库,这篇就开始带大家走进django关于模型层model的使用,model主要就是操纵数据库不使用sql语句的情况下完成数据库的增删改查.本篇仅带 ...

  6. django之模型层(model)--建表、查询、删除基础

    要说一个项目最重要的部分是什么那铁定数据了,也就是数据库,这篇就开始带大家走进django关于模型层model的使用,model主要就是操纵数据库不使用sql语句的情况下完成数据库的增删改查.本篇仅带 ...

  7. 第五章、Django之模型层---单表操作

    目录 第五章.Django之模型层---单表操作 一.ORM查询 二.Django测试环境搭建 三.单表查询 1. 增 2. 改 3. 删 4. 查 第五章.Django之模型层---单表操作 一.O ...

  8. Oracle数据库之单表查询

    接着上一篇的分享,今天主要给大家分享的是关于数据中的单表查询,单表查询很基础,也很重要,但是任何一个初学者必须要掌握的姿势,单表查询就是对单个表进行操作,查询我们想要的数据.单表查询里面的内容也是比较 ...

  9. 66、django之模型层(model)--多表相关操作(图书管理小练习)

    前面几篇随笔的数据库增删改查操作都是在单表的操作上的,然而现实中不可能都是单表操作,更多的是多表操作,一对一,一对多,多对多的表结构才是我们经常需要处理的,本篇将带我们了解多表操作的一些相关操作.也会 ...

随机推荐

  1. myeclipse一些快捷键 错了或者没说到补充下

    Ctrl + 1 快速修复Ctrl + D  删除当前行 Ctrl + Alt + ↓ 复制当前行到下一行(复制增加)Ctrl + Alt + ↑ 复制当前行到上一行(复制增加)Alt + ↓ 当前行 ...

  2. Linux入门之常用命令(3)

    df 查看硬盘总容量.已用容量和inode [-ikm] du 查看文件已用容量,显示所有文件 每块硬盘最多四个分区. fdisk [-l] [设备名称] 硬盘分区工具 (-l 显示这张硬盘的分区) ...

  3. 机器学习之numpy库中常用的函数介绍(一)

    1. mat() mat()与array的区别: mat是矩阵,数据必须是2维的,是array的子集,包含array的所有特性,所做的运算都是针对矩阵来进行的. array是数组,数据可以是多维的,所 ...

  4. Mybatis Dynamic Query 2.0.2

    项目地址:https://github.com/wz2cool/mybatis-dynamic-query 文档地址:https://wz2cool.gitbooks.io/mybatis-dynam ...

  5. Free Goodies UVA - 12260 贪心

      Free Goodies Time Limit: 3000MS   Memory Limit: Unknown   64bit IO Format: %lld & %llu [Submit ...

  6. 当前页面的url未注册 微信支付

    原因1:公众号支付授权目录或测试授权目录设置不正确. 原因2:微信SDK"WxPay.JsApiPay.php"文件中GetOpenid方法中$baseUrl的拼接的结果与支付授权 ...

  7. 深入理解C# 静态类与非静态类、静态成员的区别 [转载]

    静态类 静态类与非静态类的重要区别在于静态类不能实例化,也就是说,不能使用 new 关键字创建静态类类型的变量.在声明一个类时使用static关键字,具有两个方面的意义:首先,它防止程序员写代码来实例 ...

  8. FPGA在其他领域的应用(三)

    广播领域: 专业的A/V(音频/视频),和演播室行业正在经历着激动人心的变化,例如,UHD/8K (超高清)视频.多平台内容交付.IP网络传输和云计算.2016里约奥运会使用4K分辨率视频播放,而日本 ...

  9. JavaScript链式调用

    1.什么是链式调用? 这个很容易理解,例如 $('text').setStyle('color', 'red').show(); 一般的函数调用和链式调用的区别:链式调用完方法后,return thi ...

  10. c#中常量、ReadOnly和Static ReadOnly的差异

    不定时更新翻译系列,此系列更新毫无时间规律,文笔菜翻译菜求各位看官老爷们轻喷,如觉得我翻译有问题请挪步原博客地址 本博文翻译自: http://www.arungudelli.com/tutorial ...