通过MyModel.objects管理器方法调用查询
方法 | 说明 |
---|---|
all() | 查询全部记录,返回QuerySet查询对象 |
get () | 查询符合条件的单一记录 |
filter() | 查询符合条件的多条记录 |
exclude | 查询符合条件之外的全部记录 |
1.all()方法
select * from table
返回值QuerySet容器对象,存放MyModel实例
from bookstore.models import Book
all = Book.objects.all()
for b in all:
print(b.title)
通过all方法取回的是对象,对象中的属性可以遍历出来。
如果要输出对象的时候,就把字段全部显示出来,需要在模型中定义__str__方法
定义str方法以前
定义str方法
class Book(models.Model):
title = models.CharField("书名", max_length=50, default='', unique=True)
pub = models.CharField("出版社", max_length=100, default='')
price = models.DecimalField("定价", max_digits=7, decimal_places=2, default=0.0)
mark_price = models.DecimalField("市场定价", max_digits=7, decimal_places=2, default=0.0)
info = models.CharField('信息', max_length=100, default='')
def __str__(self):
return '%s_%s_%s_%s_'%(self.title, self.pub, self.price, self.pub, self.mark_price)
定义后
2.Values(列1,列2)方法
用法:MyModels.object.values(‘col1’,‘col2’)
返回字典
如果要遍历:
for book in all:
print(book['title'])
2.Values_list(列1,列2)方法
用法:MyModels.object.values_list(‘col1’,‘col2’)
返回元组
其他与values一致
在循环queryset需要用索引
for book in all:
print(book[0])
效果
>>> all = Book.objects.values_list('title','price')
>>> all
<QuerySet [('演员的自我修养', Decimal('20.00')), ('论金融民工的搬砖技巧', Decimal('25.00'))]>
>>> for book in all:
... print(book[0])
...
演员的自我修养
论金融民工的搬砖技巧
3.order_by(‘col1’,‘col2’)
用法:MyModels.object.order_by(‘col1’,‘col2’)升序排列
如果需要降序排列,在依据的列前面加负号
如:
>>> all.order_by('-price')
<QuerySet [('论金融民工的搬砖技巧', Decimal('25.00')), ('演员的自我修养', Decimal('20.00'))]>
>>> all.order_by('price')
<QuerySet [('演员的自我修养', Decimal('20.00')), ('论金融民工的搬砖技巧', Decimal('25.00'))]>
4.综合案例
制作一个查询功能页面,使用子路由,访问数据库中所有图书的价格
模型层–插入数据的过程忽略
from django.db import models
# Create your models here.
class Book(models.Model):
title = models.CharField("书名", max_length=50, default='', unique=True)
pub = models.CharField("出版社", max_length=100, default='')
price = models.DecimalField("定价", max_digits=7, decimal_places=2, default=0.0)
mark_price = models.DecimalField("市场定价", max_digits=7, decimal_places=2, default=0.0)
info = models.CharField('信息', max_length=100, default='')
def __str__(self):
return '%s_%s_%s_%s'%(self.title, self.pub, self.price, self.mark_price)
class Meta:
db_table = 'book'
视图层
因为模板存放在BOOKSTORE下的templates\bookstore文件夹中,引用模板时要注意地址。
后面使用locals将模型类查询的数据全部传入模板层
from django.shortcuts import render
from .models import Book
# Create your views here.
def all_book(request):
all = Book.objects.all()
return render(request,'bookstore/all_book.html',locals())
主路由
from django.contrib import admin
from django.urls import path, include
from . import views
urlpatterns = [
path('admin/', admin.site.urls),
path('test_static', views.homepage),
path('music/', include('music.urls')),
path('sport/', include('sport.urls')),
path('bookstore/', include('bookstore.urls')),
]
子路由
from . import views
from django.urls import path
urlpatterns = [
path('all_book', views.all_book)
]
模板页
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>图书查阅</title>
</head>
<body>
<table border="1">
<tr>
<th>id</th>
<th>title</th>
<th>pub</th>
<th>price</th>
<th>mark_price</th>
<th>op</th>
</tr>
{% for r in all %}
<tr>
<td>{{ r.id }}</td>
<td>{{ r.title }}</td>
<td>{{ r.pub }}</td>
<td>{{ r.price }}</td>
<td>{{ r.mark_price }}</td>
<td>
<a href="">更新</a>
<a href="">删除</a>
</td>
</tr>
{% endfor %}
</body>
</html>
显示效果
5.filter(条件)
语法:MyModel.objects.filter(key1=value1,……)
select * from talbes where key = values
from bookstore.models import Book
b1 = Book.object.filter(pub='什么出版社',price=20)
6.exclude(条件)
语法:MyModel.objects.exclude(key1=value1,……)
与filter意义相反,去非特定条件的
7.get(条件)
语法:MyModel.objects.get(key1=value1)
返回值类型是OBJECT,不是queryset
也是条件筛选,但是:返回唯一的值
如果没有数据返回值,或者返回值>1的,都会抛出异常
8.查询谓词(><……)
谓词有:
- __exact 等值匹配
Author.objects.filter(id__exact=null);主要用于查询null,一般直接用关键字
- __contains 包含 sql里面的 where name like ‘%王%’
Author.objects.filter(name__contains='王');
- __startswith \ __endswith 以XX开始\结尾,和上面一个的表达式
- __gt 大于指定值 .filter(age__gt=50)
- __gte 大于等于
- __lt 小于
- __lte 小于等于
- __in 是否在指定范围内
Author.objects.filter(country__in=['value1','value2']);
等于
select * from author where country in ('value1','value2')
- __range 是否在指定区间
Author.objects.filter(age__range=(18,55));