Django-11-最最最常用的数据库查询

本文详细介绍了Django中如何通过Model的管理器对象进行数据库的增删查改操作,包括创建数据行、多种查询方法如all(), get(), filter(), exclude()等,并提供shell辅助调试技巧。
摘要由CSDN通过智能技术生成

数据库增删查改简介

数据库的增删查改(CRUD),包括增加(Create)、查阅(Read)、更新(Update)以及(Delete),都来自ORM的核心模型类.管理器对象。该对象是模型自带的对象方法。每个源自models.Model的模型都会继承其属性和方法,用于增删查改的是objects对象,即管理器对象,而数据库的CRUD都可以通过该管理器进行操作。

辅助调试shell

为了更方便的调试数据库,可以使用:

python manage.py shell

启动该项目下的python交互,然后直接调试

>>> from students.models import Students # 导入上述数据表
>>> Students.objects.all()
<QuerySet [<Students: sunwukong-500>, <Students: zhubajie-200>]>

1.创建数据行

  • 语法
from django.models import models

class Students(models.Model):
	name = CharField(max_length=10, default='stu')
	age = Integer(default=0)
	def __str__(self): # 便于调试的时候显示返回结果
		return '%s-%s' % (self.name, self.age)

mymodel = Students()
mymodel.objects.create(属性1=1,属性2=2 ...)

# 例如
stu1 = mymodel.objects.create(name='dawa', age=500)stu1 = mymodel.objects.create(name='erwa', age=400)
mymodel.objects.create(name='sanwa', age=300)
# 上述操作即会在Students中增加3行数据

2.查询数据库

数据库查询也是需要用到mymodel.objects的方法,列举如下

查询方法备注
all()查询所有记录,返回QuerySet类型
get()返回符合条件的单一记录
filter()返回符合条件的多条记录
exclude()返回排除符合条件的多个记录

all()

通过models.objects.all()获得所有记录行,每一行是QuerySet中的一个元素,可以通过元素.列名获得具体值

from students.models import Students # 假设Students是上面包含3条记录的对象
res = Students.object.all() # queryset容器类型,里面存放类的实例
print(res)
for stu in res:
	print('学生姓名:', stu.name, '年龄:',stu.age)

<QuerySet [<Students: sunwukong-500>, <Students: zhubajie-200>, <Students: dawa-10>, <Students: erwa-8>]>
name: sunwukong age: 500
name: zhubajie age: 200
name: dawa age: 10
name: erwa age: 8

values(‘colname1’, ‘colname2’…)

返回所有数据行指定列,返回数据类型依然是QuerySet的字典格式

>>> Students.objects.values('name') 
<QuerySet [{'name': 'sunwukong'}, {'name': 'zhubajie'}, {'name': 'dawa'}, {'name': 'erwa'}]>
>>> Students.objects.values('name', 'age')
<QuerySet [{'name': 'sunwukong', 'age': 500}, {'name': 'zhubajie', 'age': 200}, {'name': 'dawa', 'age': 10}, {'name': 'erwa', 'age': 8}]>

values_list(‘colname1’, ‘colname2’…)

同上述类似,但是返回值是QuerySet的元组格式

>>> Students.objects.values_list('name','age')
<QuerySet [('sunwukong', 500), ('zhubajie', 200), ('dawa', 10), ('erwa', 8)]>

order_by(‘-colname1’, ‘colname2’…)

按列排序,默认是升序,使用-表示降序

>>> Students.objects.values('name', 'age').order_by('age')
<QuerySet [{'name': 'erwa', 'age': 8}, {'name': 'dawa', 'age': 10}, {'name': 'zhubajie', 'age': 200}, {'name': 'sunwukong', 'age': 500}]>

>>> Students.objects.values('name', 'age').order_by('-age')
<QuerySet [{'name': 'sunwukong', 'age': 500}, {'name': 'zhubajie', 'age': 200}, {'name': 'dawa', 'age': 10}, {'name': 'erwa', 'age': 8}]>

不同方法可以组合、追加使用

filter(colname1 = value1, colname2 = value2…)

多个条件是&的关系

>>> Students.objects.filter(name = 'erwa', age = '8')
<QuerySet [<Students: erwa-8>]>
>>> Students.objects.filter(name = 'erwa', age = '10') # 不在条件内的返回空QS
<QuerySet []>

exclude(colname1 = value1, colname2 = value2…)

排除符合条件的数据行

>>> Students.objects.exclude(name = 'erwa')
<QuerySet [<Students: sunwukong-500>, <Students: zhubajie-200>, <Students: dawa-10>]>

get(colname1 = value1, colname2 = value2…)

  • 比较特殊的是,这个方法只能返回1个数据行,当查不到的时候会返回DoesNotExist,当匹配到多个值时返回MultipleObjectsReturned报错。
  • 该方法最适合按照唯一值来查,例如id
>>> Students.objects.get(age = 10)
<Students: dawa-10>
>>> Students.objects.get(id = 3)
<Students: dawa-10>
>>> Students.objects.get(age = 1)
Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/django/db/models/manager.py", line 82, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
  File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/django/db/models/query.py", line 415, in get
    raise self.model.DoesNotExist(
students.models.Students.DoesNotExist: Students matching query does not exist.

更强大的查询方法:查询谓词

类型说明
__exact等值查询,age__exact=10,可简写age=10
__gt>, age__gt=10
__gte>=, age__gte=10
__lt>, age__lt=10
__lte>=, age__lte=10
__rangeage__range(0,100)
__contains包含, name__contains=‘wa’
__startswith以什么开始
__endswith以什么结束
__inname__in=[‘erwa’, ‘dawa’]

示例:

>>> Students.objects.filter(age__lte=10)
<QuerySet [<Students: dawa-10>, <Students: erwa-8>]>
>>> Students.objects.filter(age__range=(0,100))
<QuerySet [<Students: dawa-10>, <Students: erwa-8>]>
>>> Students.objects.filter(name__contains='wa')
<QuerySet [<Students: dawa-10>, <Students: erwa-8>]>
>>> Students.objects.filter(name__startswith='da')
<QuerySet [<Students: dawa-10>]>
>>> Students.objects.filter(name__endswith='wa')
<QuerySet [<Students: dawa-10>, <Students: erwa-8>]>
>>> Students.objects.filter(name__in=['dawa', 'erwa'])
<QuerySet [<Students: dawa-10>, <Students: erwa-8>]>

达内教育

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值