Django数据查询详解:get、filter、all()与values()用法对比

追风的人
追风的人
发布时间:2026-10-14 | 2人浏览过
原创

本文详解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()操作的详细介绍到此结束,希望能为读者提供参考,并欢迎大家继续支持本站。

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表