2011-11-30 48 views
1

我有这样一个模型:Multideep Django的查询

class AttributeType(models.Model): 
    name = models.CharField(max_length=32) 

class Attribute(models.Model): # Server attributes                                             
    name = models.ForeignKey(MiscType) 
    value = models.CharField(max_length=255) 

class Server(models.Model): 
    name = models.CharField(max_length=64) 
    attributes = models.ManyToManyField(Attribute, blank=True, null=True) 

然后我想创建一个循环,这应该循环槽每一个属性,找到每个服务器 其中有一个或两个属性,如:

output = [] 
for attribute in AttributeType.objects.all(): 
    for a in Server.attributes.filter(name__name=attribute.name): 
     output.append(str(a)) 

我该如何做到最高效?目前,它将在每个内部循环中运行一个查询。

像这样的输出会是什么,我想:

[{ '服务器1':[{ 'ATTRIBUTE1': 'VAL1', '值2', 'VAL3'], 'attribute2': ['val1','val2']},'server2':....}]

回答

0

我想你能做的最好的就是这样!所以它会立即返回所有系统!但你仍然需要做2个查询!这并不是什么大不了的事情,MySQL有时会有更好的行为,有2个查询,然后有很多JOIN。

att = AttributeType.objects.values_list('name', flat=True) 
for a in Server.attributes.filter(name__name__in=att): 
    output.append(str(a)) 
+0

我得每个属性的基础上,其属性是循环名称(它的一个更大的循环的一部分)。所以我不能使用__in ..我基本上想要一个列表,我每行有一个服务器,每个属性有一列,如果一个服务器有多个具有相同名称的属性,则它是逗号分隔的。 – xeor

+0

但你必须显示每个服务器的所有属性?(作为你的例子),所以你可以从服务器上获取att名称!并迭代然后显示它们! –

+0

是的,我必须显示每个服务器的所有属性。诀窍是可以有多个相同的属性。在这种情况下,我需要创建一个逗号分隔列表。所以我需要在第一个示例中同时提供它们 – xeor

0

首先收集你想获得的所有属性,例如,

attributes = set() 
for x in mybigloop: 
    attributes.add(attr) 

然后查询一次全部

for a in Server.attributes.filter(name__in=attributes): 
    output.append(str(a)) 
+0

对不起,但不是我想要的。请参阅第一个答案的评论 – xeor

+0

@xeor我不太了解您的评论,为什么你不能收集属性然后查询,你能举个简单的例子说明为什么在你的情况下这是不可能的吗? –

+0

由于每个属性可以有多个条目。我需要以某种方式抓住所有服务器上的所有服务器......我想到了一个“可能的解决方案”来解决我的问题。如果我将外键从服务器类中取出,我可以将所有映射存储在一个attributeMappings表中。然后使用select_releate来抓取它们。不知道,如果这项工作如预期般艰难.. – xeor