我有一个类似于这个的模型:
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()
由于
答案 0 :(得分:1)
三种方法,但你必须多研究一下。第三种选择可能是最适合您所寻找的。 p>
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。