ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

7DjangoORM之数据的增加和查询

2021-11-27 19:03:09  阅读:189  来源: 互联网

标签:objects price 查询 Book 7DjangoORM bookstore 数据 book a2


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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有