Django中的模型Model
class Students(models.Model):
choices = [
('male', '男'),
('female', '女'),
]
name = models.CharField(verbose_name='姓名', max_length=20, unique=True)
age = models.CharField(verbose_name='年龄', max_length=10)
sex = models.CharField(verbose_name='性别', max_length=10, choices=choices, default='male')
introduce = models.TextField(verbose_name='简介')
- 此处定义了一个名为Students的模型,该模型有name,age,sex,introduce四个字段。
- 下列是我在后台创建的几个实例,并将信息保存在数据库中。
测试数据
如图所示:
注:我之前创建了五个对象,后来被我删除了,因此现在的ID是从6开始的。
1. 使用Students.objects.all()
从数据库中获取所有对象的数据
视图函数:
from django.shortcuts import render
from django.http import HttpResponse
from .models import Students
def index(request):
student_list = Students.objects.all()
context = {
'student_list': student_list,
}
return render(request, 'polls/index.html', context)
模板:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
{% for student in student_list %}
<h1>{{ student }}</h1>
{% endfor %}
</body>
</html>
注:此时all()函数返回的是一个QuerySet,其中包含了所有的实例对象。可以利用
for标签
遍历所有的实例对象。
结果:
2. 使用Students.objects.get()
从数据库中获取单个对象的数据
视图函数:
from django.shortcuts import render
from django.http import HttpResponse
from .models import Students
def index(request):
student = Students.objects.get(pk=8)
context = {
'student': student,
}
return render(request, 'polls/index.html', context)
注:get()函数的参数除了主键之外,还可以添加
age=27
或sex='female'
等关键字,但是要注意如果关键字参数对应有两个及以上
的结果,则会报错。
模板:
<boby>
<h1>{{ student.name }}</h1>
<h1>{{ student.age }}</h1>
<h1>{{ student.sex }}</h1>
<h1>{{ student.introduce }}</h1>
</boby>
结果:
3. 使用Students.objects.filter()
来筛选从数据库中获取的信息
视图函数:
from django.shortcuts import render
from django.http import HttpResponse
from .models import Students
def index(request):
student_list = Students.objects.filter(sex='male')
context = {
'students': student_list,
}
return render(request, 'polls/index.html', context)
注:Filter()的参数还可以为
age=27
或name='李现'
等。而且还可以使用Students.objects.filter(sex='male').filter(name='李现')
来链式查询数据。
模板:
<body>
{% for student in students %}
<h1>{{ student.name }}</h1>
<h1>{{ student.age }}</h1>
<h1>{{ student.sex }}</h1>
<h1>{{ student.introduce }}</h1>
{% endfor %}
</body>
结果:
4. 使用Students.objects.exclude()
来筛选从数据库中获取的信息
视图函数:
同上,将Students.objects.filter(sex='male')改为Students.objects.exclude(sex='male')
注:顾名思义,exclude就是将符合条件的实例排除在外,得到不符合条件的实例的集合。
模板:
同上
结果:
5. 聚合函数
- 聚合函数封装在django.db.models包中。
- 聚合函数包括Count, Avg, Sum, Max, Min等。
- 使用Students.objects.aggregate()来聚合上列函数。
用法如下:
视图函数:
from django.shortcuts import render
from django.http import HttpResponse
from .models import Students
from django.db.models import Count, Avg, Sum, Max, Min
def index(request):
student_list = Students.objects.aggregate(Count('name'), Avg('age'), Sum('age'), Max('age'), Min('age'))
context = { 'students': student_list,
}
return render(request, 'polls/index.html', context)
模板:
<body>
<h1>{{ students }}</h1>
</body>
结果:
注:显然返回的是一个字典,故可以利用
{{ students.(字段)__xx }}
来访问对应的值。
6. 常用的查询过滤字段总结
- (字段)__gt= ,譬如exclude(age__gt=28)表示过滤掉年龄大于28的数据信息。
- (字段)__gte= ,譬如exclude(age__gte=28)表示过滤掉年龄大于等于28的数据信息。
- (字段)__lt= ,表示小于。
- (字段)__ite= ,表示小于等于。
- (字段)__in=(元组),譬如exclude(age__in=(28,29,30))表示过滤掉年龄为28,29或30的数据信息。
- (字段)__startswith= ,譬如exclude(name__startswith=‘abc’)表示过滤掉姓名以abc开头的数据信息。
- (字段)__istartswith= ,同上,并忽略大小写。
- (字段)__endswith= ,譬如exclude(name__endswith=‘abc’)表示过滤掉姓名以abc结尾的数据信息。
- (字段)__isendswith= ,同上,并忽略大小写。
- (字段)__range=(边界1,边界2) ,譬如exclude(age__range=(28,30))表示过滤掉年龄在28到30这个区间的数据信息。
…