【问题标题】:Group the django object according to the foreign key根据外键对django对象进行分组
【发布时间】:2019-03-23 00:20:24
【问题描述】:

我想根据外键对模型对象进行分组查询或不进行任何迭代。

例子:让,我有一个模型student:

class Student(models.Model):
    id=models.AutoField(primary_key=True)
    parentId=models.ForeignKey(parent)
    name=models.CharField()
    age=models.IntegerField()

在这里,我想使用查询或任何优化的方式相对于parentId 创建student object 组。

【问题讨论】:

  • @rje:这不是一个列表列表,而是一个字典查询集。链接的答案具有作为典型用例来聚合per“组”。
  • 没有任何迭代?
  • 是的。如果可能,我想使用 Django ORM 查询来实现这一点。 @zypro
  • @GAJESHPANIGRAHI 也许你可以写下一个解决问题的 SQL 语句?

标签: python mysql django django-models django-queryset


【解决方案1】:

尝试使用defaultdict

    from collections import defaultdict

    students = defaultdict(list)
    for result in Student.objects.order_by('parentId'):
        students[result.parentId].append(result)

【讨论】:

  • 谢谢,@zypro !!
  • @zypro 帮了我很多!新版本还有什么我们可以做的吗?
  • @VikramBankar 好吧,从 python 3.9 开始,您也可以对 defaultdicts 使用合并 (|) 和更新 (|=) 运算符。在大写的情况下,这可能对您没有多大帮助。 ;-)
【解决方案2】:

如果您按外键排序元素,那么您可以为此使用itertools.groupby:

from itertools import groupby
from operator import attrgetter

result = [
    list(v)
    for __, v in grouby(Student.objects.order('parentId_id'), attrgetter('parentId_id'))
]

或者,如果您想为将 parent 对象映射到 Students 列表的位置制作字典:

result = {
    k: list(v)
    for k, v in grouby(
        Student.objects.prefetch_realted('parentId').order('parentId_id'),
        attrgetter('parentId')
    )
}

这将因此生成一个列表列表,其中在每个子列表中,具有相同parentId 的students 被组合在一起。

注意ForeignKeys 通常有没有 _id 或Id 后缀。因此,您可能希望将模型更改为:

class Student(models.Model):
    parent = models.ForeignKey()
    name = models.CharField()
    age = models.IntegerField()

【讨论】:

    猜你喜欢
    • 2021-04-12
    • 2018-11-23
    • 2021-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-29
    • 2023-02-05
    相关资源
    最近更新 更多