Django数据查询详解:get、filter、all()与values()用法对比
本文详解Django中获取数据的四种核心方法:get、filter、all()及values()。重点解析get与filter在结果数量限制及异常处理上的差异,演示如何通过values()指定返回字段,并结合自定义过滤器示例展示前端筛选与后端distinct去重的实现逻辑。
Django数据查询核心方法概述
在Django框架中,当需要执行数据查询操作时,通常涉及以下几种核心方法。
首先,我们需要明确数据库中存储的数据结构。
假设存在一个名为students的学生信息表,其结构如下。
get与filter方法的差异分析
接下来介绍get方法的具体应用。
语法格式为:students.objects().get(a = b)
这里的a代表students表中的一个具体属性字段,例如id或name等。
例如执行:students.objects().get(name = ‘张三'),该操作旨在获取name字段值为‘张三’的学生详细信息。
filter方法的调用方式与get类似。
然而,get方法有一个严格限制:它必须且只能返回一条数据记录。
相比之下,filter方法能够返回0条、1条或多条数据记录。
这意味着,如果数据库中存在多个名为‘张三’的学生记录,执行get方法将会触发报错。
同理,如果表中根本不存在名为‘张三’的学生,get方法同样会报错。
而filter方法在这种情况下不会报错,因此在进行精准且唯一的数据查询时,推荐使用get方法。
all()与values()的字段筛选技巧
students.objects().all()用于获取表中所有的数据记录。
values(a)属性可以附加在上述三种查询方法的末尾,用于指定只获取字段a的数据。
例如:students.objects().all().values('name'),该操作将返回表中所有记录的姓名,结果是一个由字典组成的列表,格式如[{‘name':‘张三'},{‘name':‘李四'},...]。
又如:students.objects().filter(name = ‘张三').values('id'),此操作仅返回名为‘张三’的学生的id字段,不返回其他任何属性。
自定义过滤器实现字段去重显示
补充知识:利用Django filter过滤器实现显示某个类型指定字段不同值的功能。
第一步,配置前端样式。

第二步,编写HTML代码。
{% load asset_filter %}
<div class="col-sm-2">
<select class="input-sm form-control select2 inline" name="ServiceModel">
<option value="">模块</option>
{% for i in 'Ecs'|ecs_model_field_distinct:'ServiceModel' %}
{% if i.0 %}
<option value="{{ i.0 }}">{{ i.0 }}</option>
{% endif %}
{% endfor %}
</select>
</div>
第三步,编写后端代码。
asset_filter.py文件的内容如下所示。
@register.filter(name='ecs_model_field_distinct')
def ecs_model_field_distinct(model_name, field_name):
'''
获取model_name模块对象的某个属性field_name的distinct值,返回值的数组
:param model_name:
:param field_name:
:return:
'''
asset_app = apps.get_app_config('rule')
return asset_app.get_model(model_name).objects.all().values_list(field_name).distinct()
以上关于Django中查询获取数据,包括get、filter、all()及values()操作的详细介绍到此结束,希望能为读者提供参考,并欢迎大家继续支持本站。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









