制作一个“删除书籍”的页面
- 点击‘查看所有书籍’页面中的‘删除’;删除当前书籍(伪删除)
- 视图函数 delete_book
- 路由http://127.0.0.1:8000/bookstore/delete?book_id=xx
注意:相关查询获取数据的地方,要过滤出活跃数据
一个F对象代表数据库中某条记录的字段的信息
作用:
-通常是对数据库中的某条记录的字段的信息
-用于类属性(字段)之间的比较
语法:
from django.db.models import F
F('列名’)
更新Book实例中所有的零售价涨10元
Book.objects.all().update(market_price=F('market_price')+10)
#更新的方法
'UPDATE 'bookstore_book' SET 'market_price' =('bookstore_book'.market_price'+10)
#以上做法好于如下代码
books = Book.objects.all()
for book in books:
book.market_prince = book.marget_price+10
book.save()
F对象
EG:今天天气真好----点赞
def add_like(request,topic_id):
#取出文章
topic = Topic.objects.get(id = topic_id)
#更新
new_like = topic.like+1
topic.like = new_like
topic.save()
old -> update topic set like =1 where id =xxx
F ->update topic set like = like+1 where id = xxx
对数据库中的连个字段的值进行比较,列出哪些书籍的零售价高于定价
#导包
from django.db.models import F
from bookstore,models import Book
books = Book.objects.filter(market_price__gt = F('price'))
'SELECT * FROM 'bookstore_book' WHERE
'bookstore_book'.market_price'
('bookstore_book','price')
for book in books:
print(book.title,'定价':,book.price,'现价:',book,market_price)
Q对象
- 当在获取查询结果集使用复杂的逻辑或|、逻辑非~等操作时可以借助与Q对象进行操作
如:想找出定价低于20元 或者清华大学出版社的全部书。可以写成Book.objects.filter(Q(price__It=20)|Q(pub=“清华大学出版社”))
Q对象在数据包 django.db.models 中。需要先导入在使用
- 、作用:在条件中用来实现除and(&)以外的or(|)或not(~)操作运算符:& 与操作;| 或操作;
~ 非操作
语法:
from django.db.models import Q
Q(条件1)|Q(条件2) 或
Q(条件1)&Q(条件2)和
Q(条件1)&~Q(条件2)条件1成立且条件2不成立
实例:
from django.db.models import Q
#查询清华大学出版社的书或价格低于50的书
Book.objects.filter(Q(market_price__It=50)|Q(pub_house=‘清华大学出版社’))
查询不是机械工业出版社的书且价格低于50的书
Book.objects.filter(Q(market_price__It=50) & ~Q(pub_house='机械工业出版社'))
聚合查询——分组聚合
分组聚合是通过计算查询结果找那个每个对象所关联的对象集合,从而得到总计值(也可以是平均值或总和),即为查询集的每一项生成聚合
语法:
-QuerySet.annotate(结果变量名=聚合函数(‘列’))
返回值:
-QuerySet
1.通过先用查询结果MyModel.objects.values查询要分组聚合的列
MyModel.objects.values(‘列1’,‘列2’)
如:
pub_set = Book.objects.values('pub')
print(pub_set) #<querySet [{'pub':'清华大学出版社'},{'pub'
2.通过返回结果的QuerySet.annotate方法分组聚合得到分组结果
QuerySet.annotate(名=聚合函数(‘列’))
pub_count_set =
pub_set.annotate(myCount = Count('pub'))
print(pub_count_set)
原生数据库操作
Django也可以支持直接用sql语句的方式通信数据库
查询:使用MyModel.objects.raw()进行 数据库查询操作查询
语法:MyModel.objects.raw(sql语句,拼接参数)
返回值:RawQuerySet集合对象
books = models.Book.objects.raw('select * from bookstore_book ')
for book in books:
print(book)
攻击结果:可查询出所有用户数据