文章目录
数据库增删查改简介
数据库的增删查改(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 |
__range | age__range(0,100) |
__contains | 包含, name__contains=‘wa’ |
__startswith | 以什么开始 |
__endswith | 以什么结束 |
__in | name__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>]>