7DjangoORM之数据的增加和查询
作者:互联网
1增:
概念:
管理器对象:每个继承自models.Model的模型类都会有一个ojects对象,这个对象就叫管理器对象,数据库的增删改查均可通过管理对象进行操作!
一创建数据:
给表添加数据方法1:
(venv) D:\PycharmProjects\mysite3>python manage.py shell >>> from bookstore.models import Book >>> b1 = Book.objects.create(title='JQuery',price=90,market_price=85,pub='清华大学出版社')
给表添加数据方法2:
(venv) D:\PycharmProjects\mysite3>python manage.py shell >>> from bookstore.models import Book >>> b2 = Book(title='Linux',price=80,market_price=65,pub='机械工业出版社') >>> b2.save()
2查:
通过myModel.objects管理器查询的方法如下:
方法 | 说明 |
---|---|
all() | 查询全部,返回QuerySet容器对象,可以理解成类数组对象 |
get() | 查询符合条件的单一记录 |
filter() | 查询符合条件的多条记录 |
exclude() | 查询符合条件之外的全部记录 |
查询技巧:
1按需的select 字段名 form 表,方法:myModel.objects.values(...),返回值是QuerySet,例如:
(venv) D:\PycharmProjects\mysite3>python manage.py shell >>> from bookstore.models import Book #获取key-value字典对象 >>> a2 = Book.objects.values('title') >>> a2 <QuerySet [{'title': 'Django'}, {'title': 'Html5'}, {'title': 'JQuery'}, {'title': 'Linux'}, {'title': 'Python'}]> #获取value列表对象 >>> a2 = Book.objects.values_list('title',flat=True).distinct() >>> a2 <QuerySet ['Django', 'Html5', 'JQuery', 'Linux', 'Python']> #获取元组对象 >>> a2 = Book.objects.values_list('title').distinct() >>> a2 <QuerySet [('Django',), ('Html5',), ('JQuery',), ('Linux',), ('Python',)]>
2排序,加负号表示倒序,例如Book.objects.order_by('-price')
3可通过.query这个方法查看django生成的sql语句,例如:
>>> a2 = Book.objects.order_by('-price') >>> a2 <QuerySet [<Book: Book object (3)>, <Book: Book object (5)>, <Book: Book object (4)>, <Book: Book object (1)>, <Book: Book object (2)>]> >>> print(a2.query) SELECT `book`.`id`, `book`.`title`, `book`.`price`, `book`.`market_price`, `book`.`pub`, `book`.`info` FROM `book` ORDER BY `book`.`price` DESC >>> a2 = Book.objects.order_by('-price').values('title') >>> a2 <QuerySet [{'title': 'JQuery'}, {'title': 'Html5'}, {'title': 'Linux'}, {'title': 'Python'}, {'title': 'Django'}]> >>> print(a2.query) SELECT `book`.`title` FROM `book` ORDER BY `book`.`price` DESC >>>
示例练习:
从数据库中查出全部图书并渲染前端页面
1先创建前端页面
首先在应用bookstore里床架一个templates文件夹,然后在templates文件夹里再创建一个和应用名同名的文件夹bookstore,最后在这个bookstore文件夹内创建模板文件all_book.html,结构如下所示:
mysite3 D:\PycharmProject\mysite3 bookstore #应用 templates #模板 bookstore #与应用同名的文件夹 all_book.html #静态页面
2编写视图
from .models import * def all_book(request): data_book = Book.objects.all() return render(request, 'bookstore/all_book.html', locals())
3配置主路由:
urlpatterns = [ path('bookstore/',include('bookstore.urls')) ]
4配置子路由:
from django.urls import path from . import views urlpatterns = [ path('all_book',views.all_book), ]
5编写前端页面:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <table border="1" cellspacing=0 > <tr bgcolor="#d3d3d3"> <th>id</th> <th>title</th> <th>pub</th> <th>price</th> <th>market_price</th> <th>op</th> </tr> {% for book in data_book %} <tr> <td>{{ book.id }}</td> <td>{{ book.title }}</td> <td>{{ book.pub }}</td> <td>{{ book.price }}</td> <td>{{ book.market_price }}</td> <td> <span>更新</span> <span>删除</span> </td> </tr> {% endfor %} </table> </body> </html>
6浏览访问:
http://127.0.0.1:8000/bookstore/all_book id title pub price market_price op 1 Python 清华大写出版社 0.00 25.00 更新 删除 2 Django 清华大学出版社 0.00 75.00 更新 删除 3 JQuery 清华大学出版社 90.00 85.00 更新 删除 4 Linux 机械工业出版社 80.00 65.00 更新 删除 5 Html5 机械工业出版社 90.00 105.00 更新 删除
----------------------
1等值条件查询:
多条件时,条件之间是and关系例子:
我要查名字叫张三并且年龄是28的所有人:
authors = Authors.objects.filter(name='张三',age=28)
查清华大学出版社并且定价等于50以外的全部图书:
Book.objects.exclude(pun='清华大学出版社',price=50)
注意事项:
objects.get()只能查一条数据,如果结果多余一条或者没有查到苏剧都会抛异常,因此业务编程中要使用此句一定要使用try语句减少报错
#查到很多结果 bookstore.models.Book.MultipleObjectsReturned: get() returned more than one Book -- it returned 2! #没查到结果 raise self.model.DoesNotExist( bookstore.models.Book.DoesNotExist: Book matching query does not exist.
2非等值条件查询:
如果做更灵活的条件查询时,需要使用谓词
_ _exact等值匹配:
Author.objects.filter(id__exact=1) #等同于select * from author where id =1
_ _contains包含指定值:
Author.objects.filter(name__contains='w') #等价与select * from author where name like '%w%'
_ _startswith:以什么什么开始
_ _endswith:以什么什么结束
_ _gt:大于指定值
Book.objects.filter(id__gt=3) #等同于select * from book where id > 3;
_ _gte:大于等于
_ _lt:小于
_ _lte:小于等于
Author.objects.filter(age__gt=50) #等同于select * from author where age > 50
_ _in:查找数据是否在指定范围
Author.objects.filter(country__in=['中国','日本','韩国']) #等同于select * from author where country in ('中国','日本','韩国')
_ _range:查找数据是否在指定的区间范围内:
Author.objects,filter(age__range=(35,50)) #等同于select * from biao where Author between 35 and 50;
查询谓词文档:
https://docs.djangoproject.com/zh-hans/3.2/ref/models/querysets/#field-lookups
标签:objects,price,查询,Book,7DjangoORM,bookstore,数据,book,a2 来源: https://www.cnblogs.com/tyjs09/p/15612594.html