Multideep Django запрос - PullRequest
       13

Multideep Django запрос

1 голос
/ 01 декабря 2011

У меня есть такая модель:

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

Как я могу сделать это наиболее эффективным? В настоящее время он выполняет один запрос на внутренний цикл.

Вывод, подобный этому, был бы тем, что я хочу:

[{'server1': [{'attribute1': ['val1', 'val2', 'val3'], 'attribute2': ['val1', 'val2']}, 'server2': ....}]

Ответы [ 2 ]

0 голосов
/ 01 декабря 2011

Сначала соберите все атрибуты, которые вы хотите получить, например

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

Затем запросите их все сразу

for a in Server.attributes.filter(name__in=attributes):
    output.append(str(a))
0 голосов
/ 01 декабря 2011

Я думаю, лучшее, что вы можете сделать, это что-то вроде этого! так что он вернет все системы сразу! но вы все равно должны сделать 2 запроса! что не так уж и сложно, MySQL иногда лучше работает с двумя запросами, чем с большим количеством JOIN.

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