python - 从 Django 查询创建 "matrix"

标签 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()

谢谢

最佳答案

三种方法,但你需要进行更多研究。第三个选项可能最适合您正在寻找的内容。

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/

相关文章:

python - 试图将 yield 理解为一个表达式

Python检测替代峰

django - 在 django 的模型中使用相同的外键两次作为不同的字段

python - pandas 逐日迭代数据框

python - 通过 localhost 访问时无法通过 ip 地址访问 django 应用程序

python - 从pdf生成概率?

Django Rest框架批量创建

python - 如何使 rest_framework 序列化程序不允许多余的字段?

python - 查找 django 中订单数最多的表现最好的类别列表

django - 将应用程序添加到在 nginx 和 Gunicorn 上运行的 Django 项目后出现 502 错误