我有一个与此类似的模型:
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) 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 ...%} 标签
我想您正在使用 print 来发布您的答案,但您可能需要 html 格式的答案。在这种情况下,您可能需要阅读 ifchanged标签。它将允许您仅通过一次数据库访问就可以在 html 中构建矩阵。
3)多对多关系
看来您正在以一种非常特殊的方式模拟多对多关系。 Django 支持many to many relations 。您将需要一个额外的字段,因此您还必须阅读 this .
最后,为了仅通过一次数据库访问来完成您正在尝试的操作,您将需要阅读 prefetch_related
关于python - 从 Django 查询创建 "matrix",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10492033/