ORM-查询

通过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));
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

银行上班的法学程序猿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值