python - Django:作为值列表查询一部分的相关模型值列表

标签 python django django-models

我想弄清楚是否可以设置一个查询,该查询的行为类似于 Model.objects.values_list('id', 'related_model__ids') 并返回类似 的内容[(1L, [2L, 6L]), (2L, [1L,]), (3L, [1L, 3L, 4L, 5L]), ...] 下面是一些细节:

class Player(models.Model):
    positions = models.ForeignKey(Position)
    ...

>>> # players 31, 32, 33 play multiple positions, and I want a result to be
>>> # [(player.id, [a list of position.id for all positions]), ...]

>>> Player.objects.filter(id__in=[31, 32, 33]).values_list('id', 'positions__id')
[(31L, 13L), (31L, 7L), (32L, 13L), (32L, 8L), (33L, 13L), (33L, 7L)]

values_list 查询为相同的 id 值生成多个元组,为 id=31 生成两个条目,id=32id=33。当我对特定玩家 (id=31) 进行 values_list 查询时,我得到了我想要的位置 ID 列表:

>>> p31 = Player.objects.get(id=31)
>>> position_ids = p31.positions.values_list('id', flat=True)
>>> type(position_ids)
<class 'django.db.models.query.ValuesListQuerySet'>
>>> position_ids
[13L, 7L]
>>>
>>> # I want [(31L, [13L, 7L]), (32L, [13L, 8L), (33L, [13L, 7L)]
>>> # Without have to do something like a list comprehension:
>>> # [(p.id, list(p.positions.values_list('id', flat=True))
>>> #     for p in Player.objects.filter(id__in=[31, 32, 33])]

毫无疑问,列表理解会产生我想要的结果。我想避免对数据库进行多次单独查询,每个 list(p.positions.values_list('id', flat=True)) 强制将 ValuesListQuerySet 解析为一个实际的列表。当然,如果我不强制解析,对列表理解结果的操作似乎会执行一个新的 p.positions.valuse_list('id', flat=True) 查询。

最佳答案

是的,我希望也有一些分组查询方法。

我最近不得不对高度嵌套的模型做一些类似的事情,以避免一些严重的数据库调用。我最终使用 values() 有效地获取了我需要的所有值。然后,用纯 Python 将所有内容拼接在一起作为字典。它最终提高了数英里的效率,但当然定制有其自身的维护缺点。

它的要点,使用作者/书籍模型:

# models.py
class Author(models.Model):
    name = models.CharField()

class Book(models.Model):
    name = models.CharField()
    authors = models.ManyToManyField(Author)

然后在一个 View 中(或者在我的例子中是一个 shell)构建你可以传递给你的模板的字典:

>>> authors = Author.objects.prefetch_related('book_set').values('id', 'book')
>>> print authors
    [{'book': 1, 'id': 1}, {'book': 2, 'id': 1}, {'book': 2, 'id': 2}]
>>> author_dict = {}
>>> for a in authors:
    if a['id'] not in author_dict:
        author_dict[a['id']] = set()
    author_dict[a['id']].add(a['book'])
>>> print author_dict
    {1: set([1, 2]), 2: set([2])}

这可能不是您想要的答案,但这是我唯一想出的答案。我很想听听是否还有其他人使用某些原生 Django 方法解决了这个问题。

希望这对您有所帮助!

关于python - Django:作为值列表查询一部分的相关模型值列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19621726/

相关文章:

python - 自动合并任意 Django 模型

python - 无法在 Raspberry PI 4 (adafruit_circuitpython_neopixel) 上安装 Pip 包

django - 自定义 usercreationform 在 Django 中的外观

python pandas df 合并多索引的一部分

python - django-piston 中的处理程序错误

python - 将 neo4django 与 apache 一起使用

Django 外键打破多表继承

python - Django 模型继承和外键

python - 有没有办法在 Python 中不使用方括号来初始化列表?

python - sympy 表达式的精细操作