查询数据
数据的查询需要使用管理器对象进行
通过MyModel.objects管理器方法调用查询接口
1.all()方法 MyModel.objects.all()
查询MyModel实体中所有的数据,等同于select * from table
2.在模型类中定义 def __str__(self):方法可以定义默认的字符串
3.查询返回指定列 Mymodel.objects.values()
返回查询结果容器,容器内存字典,格式为: {'列1': 值1, '列2': 值2}
from bookstore.models import Book
books = Book.objects.values("title", "pub")
for book in books:
print("书名", book["title"], '出版社:', book['pub'])
print("book=", book)
4.查询返回指定列(元组表示) MyModel.objects.values_list()
from bookstore.models import Book
books = Book.objects.values_list("title", "pub")
for book in books:
print("书名", book[0], '出版社:', book[1])
print("book=", book) # ('Python', '清华⼤学出版社')..
5.排序查询 MyModel.objects.order_by('-列','列')
from bookstore.models import Book
books = Book.objects.order_by("price")
for book in books:
print("书名",book.title,'定价',book.price)
6.条件查询 MyModel.objects.filter(属性1=值1,属性2=值2)
当多个属性在一起时为"与"关系
from bookstore.models import Book
books = Book.objects.filter(pub="清华大学出版社")
from book in books:
print("书名",book.title)
#查询Author实体中name为王老师且age是28岁的
authors = Author.objects.filter(name="王老师",age=28)
7.条件查询 MyModel.objects.exclude(条件)
返回不包含此条件的全部数据集
books = Book.objects.exclude(pub="清华大学出版社",price=50)
for book in books:
print(book)
8.返回满足条件的唯一一条数据 Model.objects.get(条件)
该方法只能返回一条数据
from bookstore.models import Book
book = Book.objects.get(id=1)
print(book.title)
查询谓词
每一个查询谓词是一个独立的查询功能
1.__exact:等值匹配 Author.objects.filter(id__exact=1)
2.__contains:包含指定值 Author.objects.filter(name__contains='w')
3.__startwith:以xxx开始
4.__endwith:以xxx结束
5.__gt:大于指定值 Author.objects.filer(age__gt=50)
6.__gte:大于等于
7.__lt:小于
8.__lte:小于等于
9.__in:查找数据是否在指定范围内 Author.objects.filter(country__in=['中国','⽇本','韩国'])
10.__range:查找数据是否在指定的区间范围内 Author.objects.filter(age__range=(35,50))
修改数据
1.修改单个实体的某些字段的步骤
1.查 通过get() 2.改 通过 对象.属性 的方式修改数据 3.保存 通过 对象.save() 保存数据
from bookstore.models import Book
abook = Book.objects.get(id=10)
abook.market_price = "10.5"
abook.save()
2.QuerySet 批量修改对应的全部字段
直接调用QuerySet的update(属性=值)实现批量修改 返回值:更新数据的数量
# 将id⼤于3的所有图书价格定为0元
books = Book.objects.filter(id__gt=3)
books.update(price=0)
# 将所有书的零售价定为100元
books = Book.objects.all()
books.update(market_price=100)
删除数据
删除记录是指删除数据库中的⼀条或多条记录
删除单个MyModel对象或删除⼀个查询结果集(QuerySet)中的全部对象都是调⽤ delete()⽅法
try:
auth = Author.objects.get(id=1)
auth.delete()
except:
print(删除失败)
删除查询结果集
auths = Author.objects.filter(age__gt=65)
auths.delete()
聚合查询
1.需要导入 from django.db.models import *
聚合函数Sum,Avg,Count,Max,Min
语法 MyModel.objects.aggregate(结果变量名=聚合函数('列'))
返回结果: 格式为:'{"结果变量名":值}'
#得到书的平均价格
from bookstore.models import Book
from django.db.models import Avg
result = Book.objects.aggregate(myAvg=Avg('price'))
print("平均价格是:",result['myAvg'])
print("result=",result) # {"myAvg": 58.2}
#得到数据表里有多少本书
from django.db.models import Count
result = Book.objects.aggregate(mycnt=Count('title'))
print("数据记录总格数是:",result['mycnt'])
print("result=",result) # {"mycnt": 10}
2.分组聚合 语法:QuerySet.annotate(结果变量名=聚合函数('列'))
pub_set = Book.objects.values('pub')
print(pub_set)
pub_count_set = pub_set.annotate(myCount=Count('pub'))
print(pub_count_set)
得到那几个出版社共出版多少图书
def test_annotate(request):
from django.db.models import Count
from . import models
pub_set = models.Book.objects.values('pub')
for item in pub_count_set:
print("出版社:", item['pub'], "图书有:", item['myCount'])
return HttpResponse('请查看服务器端控制台获取结果')
F对象 一个F对象代表数据库中某条记录字段的信息
F对象在数据包django.db.models中,使用时须先导入
from django.db.models import F
更新Book实例中所有的零售价涨10元
Book.objects.all()update(market_price=F("market_price")+10)
#等同于
books = Book.objects.all()
for book in books:
book.market_price = book.marget_price+10
book.save()
对数据库中两个字段的值进行比较,列出哪些书的零售价高于定价
from django.db.models import F
from bookstore.models import Book
books = Book.objects.filter(market_price__gt=F('price'))
fro book in books:
print(book.title,'定价',book.price,'现价:',book.market_price)
Q对象
当在获取查询结果集使用复杂的逻辑或|、逻辑非~等操作时可以借助于 Q对象进⾏操作
如: 想找出定价低于20元 或 清华⼤学出版社的全部书,可以写成
Book.objects.filter(Q(price__lt=20)|Q(pub="清华大学出版社"))
from django.db.models import Q
# 查找清华⼤学出版社的书或价格低于50的书
Book.objects.filter(Q(market_price__lt=50)|Q(pub_house = "清华大学出版社"))
# 查找不是机械⼯业出版社的书且价格低于50的书
Book.objects.filter(Q(market_price__lt=50) & ~Q(pub_house='机械工业出版社'))
原生的数据库操作方法
MyModel.objects.raw()进行数据库查询操作查询
语法 MyModel.objects.raw(sql语句,[拼接参数])
books = Book.objects.raw("selsct * from bookstore_book")
for book in books:
print(book)
#sql 注入问题
s1 = Book.objects.raw('select * from bookstore_book where id=%s'%('1 or 1=1'))
使用django中的cursor对数据库进行增删改查操作
导入cursor对数据库进行增删改查操作 from django.db import connection
# ⽤SQL语句将id 为 10的 书的出版社改为 "XXX出版社"
from django.db import connection
with connection.cursor() as cur:
cur.execute('update bookstore_book set pub_house="XXX出版社" whereid=10;')
with connextion.cursor() as cur:
cur.execute('delete from bookstore_book where id=10;')
本文详细介绍了Django中如何进行数据查询,包括all()、values()、values_list()、order_by()、filter()、exclude()、get()等方法的使用,以及条件查询谓词、数据修改、删除和聚合查询的操作。还提到了原始SQL查询和cursor的使用。
1335

被折叠的 条评论
为什么被折叠?



