Django与数据库之间的数据简单交互之查询

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='简介')
  1. 此处定义了一个名为Students的模型,该模型有name,age,sex,introduce四个字段。
  2. 下列是我在后台创建的几个实例,并将信息保存在数据库中。

测试数据

如图所示:

在这里插入图片描述

注:我之前创建了五个对象,后来被我删除了,因此现在的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=27sex='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=27name='李现'等。而且还可以使用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. 聚合函数

  1. 聚合函数封装在django.db.models包中。
  2. 聚合函数包括Count, Avg, Sum, Max, Min等。
  3. 使用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. 常用的查询过滤字段总结

  1. (字段)__gt= ,譬如exclude(age__gt=28)表示过滤掉年龄大于28的数据信息。
  2. (字段)__gte= ,譬如exclude(age__gte=28)表示过滤掉年龄大于等于28的数据信息。
  3. (字段)__lt= ,表示小于。
  4. (字段)__ite= ,表示小于等于。
  5. (字段)__in=(元组),譬如exclude(age__in=(28,29,30))表示过滤掉年龄为28,29或30的数据信息。
  6. (字段)__startswith= ,譬如exclude(name__startswith=‘abc’)表示过滤掉姓名以abc开头的数据信息。
  7. (字段)__istartswith= ,同上,并忽略大小写。
  8. (字段)__endswith= ,譬如exclude(name__endswith=‘abc’)表示过滤掉姓名以abc结尾的数据信息。
  9. (字段)__isendswith= ,同上,并忽略大小写。
  10. (字段)__range=(边界1,边界2) ,譬如exclude(age__range=(28,30))表示过滤掉年龄在28到30这个区间的数据信息。
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值