其他分享
首页 > 其他分享> > 7DjangoORM之数据的增加和查询

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