一对多关系中的 Django 查询

2024-01-04

我有 2 个表,Order 和 OrderDetails,在 OrderDetails 上我有一个字段“product_type”。

我想从 Order 表中获取列表中的所有 Product_type 字段。

Order.objects.filter(pk=1).annotate(type=F('product_type'))

我想要type值返回所有产品类型的列表,而不仅仅是第一个结果,例如“椅子”。

Ex: type = ['chair', 'pencil']

Models:

class Order(models.Model):
    user = models.ForeignKey(User, related_name="orders")

class OrderDetails(models.Model):
    order = models.ForeignKey(Order, related_name="details")
    quantity = models.SmallIntegerField(null=False, blank=False)
    product_type = models.CharField(null=False, blank=False)

这不是您可以或应该尝试通过查询集注释来实现的目标。这是因为注释仅可用于聚合函数,例如Count, Sum etc.

如果我正确理解您的问题,您可以在迭代查询集时获取此信息:

for order in Order.objects.all():
    types = order.details.values_list('product_type', flat=True)

您可以通过预取相关的内容来提高效率OrderDetail每个订单的行数:

for order in Order.objects.prefetch_related('details'):
    types = order.details.values_list('product_type', flat=True)

或者,您可以使用此方法从每个订单中检索一些值:

queryset = Order.objects.values('id', 'user_id', 'details__product_type')

它应该执行单个数据库查询。但是,请参阅此处有关其工作原理的注释:https://docs.djangoproject.com/en/1.9/ref/models/querysets/#values https://docs.djangoproject.com/en/1.9/ref/models/querysets/#values

您的查询集将输出字典而不是模型实例。你不会得到一份不错的清单product_type相反,您会得到重复的行,例如:

[
    {'id': 1, 'user_id': 1, 'product_type': 'chair'},
    {'id': 1, 'user_id': 1, 'product_type': 'table'},
    {'id': 2, 'user_id': 3, 'product_type': 'chair'},
    ...
]

...所以你必须将 python 中的这些行分组到你想要的数据结构中:

from collections import OrderedDict

grouped = OrderedDict()
for order in Order.objects.values('id', 'user_id', 'details__product_type'):
    if order['id'] not in grouped:
        grouped[order['id']] = {
            'id': order['id'],
            'user_id': order['user_id'],
            'types': set(),
        }
    grouped[order['id']]['types'].add(order['details__product_type'])
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

一对多关系中的 Django 查询 的相关文章

随机推荐

  • PHP“while”循环或另一个“while”循环中的“if”语句?

    我有一个返回 HTML 表的 PHP MySQL 查询 但我被困在需要进行第二个查询的部分while循环该查询 我不知道从这里该去哪里 我尝试了几种不同的方法 我希望它循环并给我第一组数据 然后使用 Order ID 并获取第二组数据并将第
  • 如何在Android智能手机中使用加速度传感器找到位移距离?

    我有一部 Android 智能手机 其中包含加速器传感器 指南针传感器和陀螺仪传感器 我想使用这个传感器计算位移距离 我已经尝试过基本方法 即 final velocity initial velocity acceleration tim
  • 切换仅包含相同文本的 div

    HTML div class event div class clicker click div div class title a href first event a div div div class event div class
  • 检索 Facebook 粉丝姓名

    我正在尝试获取我管理的 Facebook 粉丝页面的粉丝姓名 我做了一些窥探 显然 FB API 不支持这一点 但 Facebook 实际上使用 AJAX JSON 来填充列表 无论如何 任何人都可以建议一种方法来让我自己调用并以纯文本形式
  • 超小屏幕上的居中按钮 Material-UI React 不起作用(justify-xs-center)

    我尝试了一切 但似乎我错过了一些东西 当屏幕特别小时 我花了很多时间在网格内制作一个按钮中心 这段代码工作完美 但问题是我希望我的按钮仅在屏幕特别小时而不是在所有尺寸上居中 工作代码 Grid item xs 12 gt
  • 不显示python OpenCV错误

    我正在使用 OpenCV 和 python 更具体地说findTransformECC的功能cv2执行图像配准 如果算法不收敛 此函数可能会引发错误 我用一个简单的方法捕获了错误try except指令 然后我处理错误 但是 OpenCV
  • 在 Swing 中使用计时器显示图片 5 秒

    我正在尝试使用以下方法为我的应用程序制作登录图片Timer 这个想法是 当用户打开应用程序时 他将看到一张图片 5 秒钟 然后应用程序将启动 我尝试过 正如你在方法中看到的shoutoff To change this license he
  • Facebook 的 Android ProGuard 设置

    我终于找到了为什么我的应用程序崩溃而构建的发布 ProGuard 确实从我的应用程序中剥离了代码 但我通过在 proguard android txt 在 sdk 中找到 中使用 keep 命令手动添加类来阻止这种情况 对于 Faceboo
  • 如何使用 NEST 在 Elasticsearch 中按索引获取所有文档?

    我想通过索引获取所有文档 我已经尝试过以下方法 var response client Search s gt s Index test MatchAll 响应返回 成功操作 但它没有命中任何文档 尽管该索引下有很多文档 To get al
  • npm 在 eslint 报告末尾抛出错误

    我在打字稿项目上运行 eslint 时遇到问题 我有以下 package json 我在其中编写了一个运行 eslint 的脚本 name ts tutorial version 1 0 0 description main index j
  • AngularJS中触发输入文件点击事件

    我正在尝试模拟 AngularJS 中文件输入的单击事件 我见过工作 jQuery 示例 http jsfiddle net fEBFp 1 但我不想使用 jQuery use strict angular module MyApp con
  • type_info 不考虑简历限定符:这是对的吗?

    此代码打印 1 是正确的行为还是 g 4 5 的怪癖 include
  • 共享库构造函数不工作

    在我的共享库中 我必须在加载时进行某些初始化 如果我用 GCC 属性定义函数 attribute constructor 它不起作用 即当加载链接我的共享库的程序时它不会被调用 如果我将函数名称更改为 init 有用 显然使用 init a
  • Android 框架布局点击侦听器不起作用

    我有一个FrameLayout有两个嵌套LinearLayouts 我想要一个onClickListener for FrameLayout 经过搜索我得到了解决方案clickable false 这是我的布局文件
  • 有没有一种简单的方法可以将所有 jar 依赖项复制到 XSBT 0.11.2 中的某个目录?

    当从旧版本的 SBT 切换到最新版本时 我们失去了快速获取所有 jar 依赖项并将它们复制到目录的能力 有没有一种简单的方法可以在 XSBT 0 11 2 中执行相同的操作 将以下内容添加到您的build sbt将所有依赖项复制到lib m
  • 无法在 Symfony 2 中使用渲染方法找到 Twig 模板

    我在尝试引用特定 Twig 模板时遇到问题 我正在使用render方法是 SF2 主控制器的一部分 但我显然没有正确引用 使用它 这是我的目录 文件结构 src AyrshireMinis CommonBundle Controller D
  • 如何根据用户输入退出 while(1) ?

    我有一个简单的server client终端 服务器从客户端接收字符串并对其进行处理 服务器只有收到后才会开始处理end of input在我的例子中的角色是 下面的 while 循环旨在允许用户输入多个不同的字符串 并且应该在接收到时停止
  • C 数组到 PyArray

    我正在编写一个 Python C 扩展 而不使用 Cython 我想在 C 中分配一个双精度数组 在内部函数 恰好在 Fortran 中 中使用它并返回它 我指出 C Fortran 接口在 C 中运行得很好 static PyObject
  • 时间序列分析 - 不均匀间隔的度量 - pandas + statsmodels

    我有两个 numpy 数组 light points 和 time points 想对这些数据使用一些时间序列分析方法 然后我尝试了这个 import statsmodels api as sm import pandas as pd td
  • 一对多关系中的 Django 查询

    我有 2 个表 Order 和 OrderDetails 在 OrderDetails 上我有一个字段 product type 我想从 Order 表中获取列表中的所有 Product type 字段 Order objects filt