Django Web笔记2

本文详细介绍了Django中如何进行数据查询,包括all()、values()、values_list()、order_by()、filter()、exclude()、get()等方法的使用,以及条件查询谓词、数据修改、删除和聚合查询的操作。还提到了原始SQL查询和cursor的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

查询数据

 数据的查询需要使用管理器对象进行

通过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;')

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值