1

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

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

谢谢

4

2 回答 2

1

三种方法,但您将不得不进行更多研究。第三种选择可能最适合您的需求。

1) Django 查询

需要很长时间的原因是因为您在这一行中不断地访问数据库:

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

您可能必须开始阅读 Django 文档中有关查询处理方式的内容。对于您正在做的事情,您必须创建算法以避免过滤器。使用 MyModel.objects.order_by('a') 可以帮助您构建高效的算法。

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

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

3) 多对多关系

似乎您正在以一种非常特殊的方式模拟多对多关系。Django 支持多对多关系。您将需要一个额外的字段,因此您还必须阅读内容。

最后,要通过一次访问数据库来执行您正在尝试的操作,您需要阅读prefetch_related

于 2012-05-08T05:05:25.647 回答
0

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

于 2012-05-08T04:47:21.460 回答