2012-05-08 30 views
1

我有类似这样的一个模型的“矩阵”:建立从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() 

感谢

回答

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('a')可以帮助您构建高效的算法。

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

我想你正在使用的打印张贴您的答案,但你可能需要在HTML中。在这种情况下,您可能需要阅读ifchanged标签。它将允许你只用一个数据库访问就可以在html中建立你的矩阵。

3)多对多关系

看来你是那种模拟多对多关系中一个非常特殊的方式。 Django支持many to many relations。您需要额外的字段,因此您还需要阅读this

最后,做什么,你都只有一个访问数据库的尝试,你会需要阅读prefetch_related

+0

我会检查文件的过滤器。我正在使用print,因为我正在测试一个脚本(我们远没有开始制作视图)而且它不是很多人,因为在'external'中我不能有重复;然而,我对'a'和'b'之间的关系感兴趣,因为ab与ba不同。但这些都是很棒的想法,我想我可以再次开始研究,谢谢 – Darkade

0

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