Django学习——topic3

制作一个“删除书籍”的页面

  • 点击‘查看所有书籍’页面中的‘删除’;删除当前书籍(伪删除)
  • 视图函数 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)

攻击结果:可查询出所有用户数据

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值