从Django查询中创建一个“矩阵”

时间:2012-05-08 03:07:10

标签: python django

我有一个类似于这个的模型:

class MyModel(models.Model):
    name = models.CharField(max_length = 30)
    a    = models.ForeignKey(External)
    b    = models.ForeignKey(External, related_name='MyModels_a')

    def __unicode__(self):
        return self.a + self.b.name + self.b.name

因此,当我查询它时,我会得到类似的结果:

>>> MyModel.objects.all()
[<MyModel: Name1AB>,<MyModel: Name2AC>,<MyModel: Name3CB>,<MyModel: Name4BA>,<MyModel: Name5BA>]

我想表示这些数据类似于以下内容。

[[ []                 , [Name1AB] , [Name2AC] ]
 [ [Name4BA, Name5BA] , []        , []        ]
 [ []                 , [Name3CB] , []        ]]

正如您所看到的,模型中的行将是“a”;而列将是'b' 我可以做到这一点,但这需要很长时间,因为在真正的数据库中我有很多数据。我想知道是否有建立Django的方法来实现这一目标。

我这样做:

mymodel_list  = MyModel.objects.all()
external_list = External.objects.all()

for i in external_list:
    for j in external_list:

        print(mymodel_list.filter(a=i).filter(arrl=j).all(),end='')
        print()

由于

2 个答案:

答案 0 :(得分:1)

三种方法,但你必须多研究一下。第三种选择可能是最适合您所寻找的。

1)Django查询

花费很长时间的原因是因为您不断访问此行中的数据库:

print(mymodel_list.filter(a=i).filter(arrl=j).all(),end='')

您可能必须开始阅读Django文档中有关the way of working with queries的内容。对于您正在做的事情,您必须创建算法以避免过滤器。使用MyModel.objects.order_by(&#39; a&#39;)可以帮助您构建有效的算法。

2){%ifchanged ...%}标签

我想你使用print发布你的答案,但你可能需要用html。在这种情况下,您可能需要阅读ifchanged标记。它允许您使用一个db访问权限在html中构建矩阵。

3)多对多的关系

看起来你有点以非常特殊的方式模拟多对多的关系。 Django支持many to many relations。您将需要一个额外的字段,因此您还必须阅读this

最后,只需一次访问数据库即可完成您的尝试,您需要阅读prefetch_related

答案 1 :(得分:0)

没有内置方式(因为你需要的不常见)。您应该手动编写它,但我建议检索完整数据集(或至少一个表行的数据集)并在Python中处理它,而不是在每个表格单元格中命中DB。