我试图弄清楚是否可以设置一个查询,该查询的行为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 列表:id=31
id=32
id=33
values_list
id=31
>>> 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))
强制将 a 解析为ValuesListQuerySet
实际列表。当然,如果我不强制解决,对列表理解结果的操作似乎会执行新的p.positions.valuse_list('id', flat=True)
查询。