如何在django中使用子查询?

2024-04-13

我想获取每个客户最新购买的列表,按日期排序。

以下查询执行我想要的操作(除了日期之外):

(Purchase.objects
         .all()
         .distinct('customer')
         .order_by('customer', '-date'))

它会生成如下查询:

SELECT DISTINCT ON 
    "shop_purchase.customer_id" 
    "shop_purchase.id" 
    "shop_purchase.date" 
FROM "shop_purchase" 
ORDER BY "shop_purchase.customer_id" ASC, 
         "shop_purchase.date" DESC;

我被迫使用customer_id作为第一个ORDER BY表达因为DISTINCT ON.

我想按日期排序,所以我真正需要的查询应该如下所示:

SELECT * FROM (
  SELECT DISTINCT ON 
      "shop_purchase.customer_id" 
      "shop_purchase.id" 
      "shop_purchase.date" 
  FROM "shop_purchase" 
  ORDER BY "shop_purchase.customer_id" ASC, 
           "shop_purchase.date" DESC;
  )
AS result 
ORDER BY date DESC;

我不想使用 python 进行排序,因为我仍然需要对查询进行页面限制。数据库中可能有数万行。

事实上,它目前在 python 中排序,导致页面加载时间很长,所以这就是我试图解决这个问题的原因。

基本上我想要这样的东西https://stackoverflow.com/a/9796104/242969 https://stackoverflow.com/a/9796104/242969。是否可以使用 django 查询集来表达它,而不是编写原始 SQL?

实际的模型和方法有几页长,但这里是上面的查询集所需的模型集。

class Customer(models.Model):
  user = models.OneToOneField(User)

class Purchase(models.Model):
  customer = models.ForeignKey(Customer)
  date = models.DateField(auto_now_add=True)
  item = models.CharField(max_length=255)

如果我有这样的数据:

Customer A - 
    Purchase(item=Chair, date=January), 
    Purchase(item=Table, date=February)
Customer B - 
    Purchase(item=Speakers, date=January), 
    Purchase(item=Monitor,  date=May)
Customer C - 
    Purchase(item=Laptop,  date=March), 
    Purchase(item=Printer, date=April)

我希望能够提取以下内容:

Purchase(item=Monitor, date=May)
Purchase(item=Printer, date=April)
Purchase(item=Table,   date=February)

每个客户的列表中最多有一次购买。购买的是每个客户的最新产品。它是按最新日期排序的。

该查询将能够提取:

SELECT * FROM (
  SELECT DISTINCT ON 
    "shop_purchase.customer_id" 
    "shop_purchase.id" 
    "shop_purchase.date" 
  FROM "shop_purchase" 
  ORDER BY "shop_purchase.customer_id" ASC, 
           "shop_purchase.date" DESC;
) 
AS result 
ORDER BY date DESC;

我正在尝试找到一种不必使用原始 SQL 来实现此结果的方法。


这可能不完全是您正在寻找的东西,但它可能会让您更接近。看一眼Django 的注释 https://docs.djangoproject.com/en/dev/ref/models/querysets/#annotate.

这是一个可能有帮助的示例:

  from django.db.models import Max
  Customer.objects.all().annotate(most_recent_purchase=Max('purchase__date'))

这将为您提供一份客户模型列表,每个模型都有一个名为“most_recent_purchase”的新属性,并将包含他们上次购买的日期。生成的 sql 如下所示:

SELECT "demo_customer"."id", 
       "demo_customer"."user_id", 
       MAX("demo_purchase"."date") AS "most_recent_purchase"
FROM "demo_customer"
LEFT OUTER JOIN "demo_purchase" ON ("demo_customer"."id" = "demo_purchase"."customer_id")
GROUP BY "demo_customer"."id",
         "demo_customer"."user_id"

另一种选择是向您的客户模型添加一个属性,如下所示:

  @property
  def latest_purchase(self):
    return self.purchase_set.order_by('-date')[0]

显然,您需要处理该属性中没有任何购买的情况,并且这可能不会很好地执行(因为您将为每个客户运行一个查询来获取他们最新的购买)。

我过去曾使用过这两种技术,并且它们在不同情况下都运行良好。我希望这有帮助。祝你好运!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在django中使用子查询? 的相关文章

  • JPA 和 PostqreSQL:长字符串持久化

    谁能告诉我如何使用 JPA 保存长文本 我使用 PostgreSQL 这是我在类中定义很长字符串的方法 Lob private String body 然而 这会产生一个类型的字段字符变化 255 在数据库中 此外 我尝试使用 Column
  • Postgresql 串行错误自动增量

    我在 postgresql 上遇到问题 我认为 postgresql 中有一个错误 我错误地实现了一些东西 有一个表包括colmn1 primary key colmn2 unique colmn3 插入一行后 如果我尝试使用现有的另一次插
  • 唯一约束与唯一索引?

    之间有区别吗 CREATE TABLE p product no integer name text UNIQUE price numeric and CREATE TABLE p product no integer name text
  • 使用标签或 href 传递 Django 数据

    我有一个包含链接的表 当单击该链接进行更多操作时 我想将一些数据传递给我的函数 my html table tbody for query in queries tr td value a href internal my func que
  • 跨应用程序使用 Django 模型?

    因此 在我的 Django 项目中 我有几个不同的应用程序 每个应用程序都有自己的模型 视图 模板等 让这些应用程序进行通信的好方法 Django 方式 是什么 一个具体的例子是一个会议应用程序 它有一个会议模型 我有一个家庭应用程序 我想
  • “从表中选择不同的字段名称”Django使用原始sql

    我怎样才能跑SELECT DISTINCT field name from table Django 中的 SQL 查询为raw sql 当我尝试使用时Table objects raw SELECT DISTINCT field name
  • 如何使用基于类的视图处理表单(通过 get 或 post)?

    我正在尝试学习基于类的视图 因为详细信息或列表视图并不那么复杂 我有一个搜索表单 我只想看看是否发送查询来显示结果 这是函数代码 不是我的 来自 django 书籍 def search page request form SearchFo
  • Postgres:显示继承的字段

    我应该实现什么查询来获取继承的列 读过this http www alberton info postgresql meta info html综合帖子没有找到解决办法 如果我理解正确的话 您想知道作为表之间继承的一部分的列的名称 SELE
  • Django:分解视图

    这实际上只是一个 最佳实践 问题 我发现在开发应用程序时 我经常会遇到a lot的意见 将这些视图分成几个视图文件是常见的做法吗 换句话说 不仅仅是views py 通常还有views 1 py views 2 py views 3 py
  • Django 不断迁移相同的外键

    我正在将现有数据库导入到它自己的 Django 项目中 我已经从数据库生成了初始模型 通过inspectdb 并且通过注释使 Django 能够一次控制每个表managed False表元设置中的行 我从简单的模型开始 在启用带有外键的表时
  • TEST 镜像默认数据库但没有数据

    我正在尝试对我的 Django 应用程序进行一些测试 我使用了数据库镜像作为测试数据库 当我尝试运行一些测试时 默认数据库 中的数据似乎在镜像测试数据库中不可用 default sqlite ENGINE django db backend
  • Django 中从 sqlite 迁移到 postgresql

    我想迁移自sqlite to PostgreSQL db 我安装了 postgresql 并在其 shell 上创建数据库 然后配置我的 django 设置如下 default ENGINE django db backends postg
  • 嵌套字典中的 Django 模板

    我正在使用 Django 模板 并且遇到了嵌套字典的一个问题 Dict result dict type 0 file name abc count 0 type 1 file name xyz count 50 我的 HTML 文件中的模
  • “一旦获取切片就无法更新查询”。最佳实践?

    由于我的项目的性质 我发现自己不断地从查询集中取出切片 如下所示 Thread objects filter board requested board id order by updatedate 10 但这给我带来了实际对我选择的元素进
  • Django all-auth:如何禁用通过 Google 自动登录

    我正在使用 django allauth 包通过 Google API 让用户登录到我的 Django 应用程序 我的问题是 当用户通过外部 Google 登录页面成功登录时 每次他注销并想要再次登录时 django allauth 都会自
  • Postgres JSON 数据类型 Rails 查询

    我正在使用 Postgres 的 json 数据类型 但想要使用嵌套在 json 中的数据进行查询 排序 我想在 json 数据类型上使用 where 进行订购或查询 例如 我想查询关注者数量 gt 500 的用户 或者我想按关注者或关注数
  • 如何使用 javascript/jquery/AJAX 调用 Django REST API?

    我想使用 Javascript jQuery AJAX 在前端调用 Django Rest API 请求方法是 POST 但当我看到 API 调用它的调用 OPTIONS 方法时 所以 我开始了解access control allow o
  • Django - 提交具有同一字段多个输入的表单

    预警 我对 Django 以及一般的 Web 开发 非常陌生 我使用 Django 托管一个基于 Web 的 UI 该 UI 将从简短的调查中获取用户输入 通过我用 Python 开发的一些分析来提供输入 然后在 UI 中呈现这些分析的可视
  • 将 python 字典中的数据呈现给 django 模板。

    我有一本字典 data sok 1 10 sao 1 10 sok sao 2 20 我如何 循环字典 将我的数据作为 HTML 表呈现给 Django 模板 这种格式为表格 author qty Amount sok 1 10 sao 1
  • 在 Bootstrap 中使单击的选项卡处于活动状态

    我正在使用 Django 并将 Bootstrap 与 Django 集成 这是我的导航栏 HTML 代码 div class navbar navbar default navbar fixed top div class contain

随机推荐

  • 缺少 mingwm10.dll

    我正在使用 Qt Creator 编写一个 C 项目 一切工作正常 调试 发布 但是当我直接运行编译后的 exe 转到 exe 文件并运行它 时 它说 mingwm10 dll 丢失 对于这个问题我能做什么 您可以执行以下操作 as cha
  • 本地主机上使用 DotNetOpenAuth 的 OpenID 提供程序

    我在本地运行 DotNetOpenAuth 示例提供程序 它似乎可以通过 Web 浏览器正确处理请求 我可以在调试器中单步执行授权处理程序 我有一个项目可以通过 Google 和其他提供商进行身份验证 但无法通过示例提供商进行身份验证 示例
  • 使用 VBA 将唯一编号添加到 Excel 数据表

    我有两列数字 它们在一起将是唯一的 复合键 我想创建一个唯一的 ID 号 第三列 类似于 MS Access 使用主键的方式 我想在 VBA 中执行此操作 但我不知道如何执行此操作 我的 Excel 中的 VBA 不太好 所以希望您能看到我
  • iOS NSBlock的NSMethodSignature(或编码)

    我需要一种方法来在运行时检查给定块的参数数量和参数类型 我当前正在编写的某些对象映射库需要这个 我将字符串格式的值映射到选择器 希望块也如此 我尝试了下面示例中的代码 但由于某种原因它对我不起作用并且返回 nil 字符串描述 你知道一种在运
  • 如何在 Ubuntu 中注册文件关联

    我正在创建 Ubuntu 安装程序 我需要注册自己的文件扩展名 但我找不到任何有关如何执行此操作的示例 人们可以为我提供一些关于如何执行此操作的脚本片段吗 注意 我正在使用安装干扰器 http www installjammer com 帮
  • 带有heredocs的Python子进程

    我正在使用 Python 的子进程模块 尝试了一些示例 但我似乎无法让 Heredoc 语句发挥作用 这是我正在玩的一个简单的例子 import subprocess a A String of Text p subprocess Pope
  • 转换回原始类时出现 ClassCastException 错误

    我有以下代码 public void doJob MyObj s for Object o MyObj all fetch s MyObj o ClassCastException here if s fileExists Do some
  • 在 x86-64 上,“movnti”指令是原子指令吗?

    在 x86 64 CPU Intel 或 AMD 上 将 4 8 字节写入 32 64 位对齐地址的 movnti 指令是原子的吗 Yes movnti在自然对齐的地址上是原子的 就像 x86 上所有其他自然对齐的 8 16 32 64b
  • 在您自己的应用程序中直观地包含另一个应用程序

    我有四个用 Delphi Win32 编写的小型单一形式实用程序应用程序 每隔一段时间我就想以一种让它们 感觉 起来好像它们都是一个应用程序的方式使用它们 主要是为了切换回来他们之间的来回非常容易 例如 如果能够将它们作为容器插入 TabS
  • npm 错误 semver 无效

    刚刚从源代码安装了 Node js v 0 10 20 目标盒 Ubuntu 12 04 3 LTS 节点安装正常 没有错误 毕竟看起来 node v v0 10 20 npm v 1 3 11 但只是列出我的 g 模块 我收到一些我无法弄
  • 如何使用 Graph API 从 Facebook 评论字段获取

    我使用 comment id 获取 from 字段并使用页面访问令牌 comment id fields from access token PAGE ACCESS TOKEN 但我没有得到所需的输出 我只得到评论 ID id commen
  • 如何在 IE7 中将绝对定位的 div 居中?

    更新了布局的提供上下文 I have a relatively simple structure for my page The page is composed of two div s both absolutely positione
  • 使用 pathlib 模块关闭文件的推荐方法?

    从历史上看 我总是使用以下内容来读取文件python with open file r as f for line in f do thing to line 这仍然是推荐的方法吗 使用以下内容是否有任何缺点 from pathlib im
  • 在C语言中,我可以通过堆栈指针访问另一个函数中主函数的局部变量吗?

    我需要访问在 main 函数中定义的变量 a 的值 而不将其作为参数传递 main int a 10 func printf d n a void func i need access of variable a here 我怎样才能做到这
  • jQuery 选择列表选项通过另一个元素 onchange 事件更改后触发事件

    我有一个选择列表 select2 每次更改另一个选择列表 select1 时 其选项都会更改 select2 的选项始终取决于 select1 的值 并且每次 select1 更改时都会更改 是否有一个函数可以绑定到 select2 元素
  • 如何在局域网上部署PHP应用程序? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我是一名网页设计师和 PHP 开发人员 我用 PHP 创建了一些网站 并将它们部署到来自不同供应商 如 GoDaddy Yahoo M
  • java.lang.IllegalArgumentException - 对话框.dismiss

    我在发布的应用程序中收到此错误 只有客户端收到此错误 我已经多次尝试复制同样的错误 但没有成功 我也已经尝试在所有有对话框的位置使用下面的代码 但也没有解决 if dialog isShowing dialog dismiss 错误报告 j
  • 箭头函数后面带()的意思是什么? [复制]

    这个问题在这里已经有答案了 const actionsMap GET USER state action gt post action msg 我有这个我偶然发现的代码 我一直在使用 格式的箭头函数 这个 包装器是什么意思 对于箭头函数 您
  • Android 浏览器忽略响应式网页设计

    我刚刚开始将我的网站转换为 响应式网页设计 我安装了 Firefox 的 Web Developer 插件 http chrispederick com work web developer http chrispederick com w
  • 如何在django中使用子查询?

    我想获取每个客户最新购买的列表 按日期排序 以下查询执行我想要的操作 除了日期之外 Purchase objects all distinct customer order by customer date 它会生成如下查询 SELECT