合并两个列表或使用查询集?

2024-03-29 00:28:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我的模型如下(floor和board中的字段无关紧要且省略)

class floor(models.Model):

class board(models.Model):

class run(models.Model):
    floor = models.ForeignKey(Floor)
    boards = models.ManyToManyField(Board)

我有如下疑问:

^{pr2}$

返回2个run对象。每次运行都有一系列板。在

runs[0].boards

返回相关板的列表。如果我理解如下:

[run.boards.all() for run in runs]

我得到了这样的列表:

[[1,2,3,4,5], [6,7,8,9,10]]

什么是一个有效和有效的方法将上面的列表转换成下面的列表?在

[1,2,3,4,5,6,7,8,9,10]

我希望一个单线解决方案。使用django查询集的方法可以实现这一点,还是最好使用python来实现?在


Tags: 方法run模型board列表modelmodelsruns
3条回答

我能想到的最简单的方法是:

>>> all_boards=[]
>>> for boards in (run.boards.all() for run in runs):
        all_boards+=run
>>> all_boards
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> 

我将[...]列表理解改为生成器理解(...)。这里可能不重要,但是对于某些应用程序,您可以使用生成器而不是每次构建完整的列表来节省大量内存。在


旁白

你可以保持懒惰:

^{pr2}$

这些元素是从G()中出来的,展平,一次一个元素,所以您可以遍历它们并对每个元素执行工作,而不必构建一个临时列表。在

尽管这个问题得到了更好的回答,但我无法抗拒我的itertools主张

from itertools import chain

all_boards = list(chain(*runs))

简单:

board.objects.filter(run__floor=1)

相关问题 更多 >