Python dict заканчивается пустым после итерации - PullRequest
0 голосов
/ 15 апреля 2011

У меня проблема с использованием dict в python, я просто получаю пустой словарь.

выглядит так, как будто я стираю данные каждый раз

этот код предполагает создание тестов, включающих тесты для каждого сайта.

заранее спасибо

tests={}
for t in Test.objects.all():
    for s in Site.objects.all():
        site={}
        for sv in s.siteversions.all():
            siteversion=sv.version
            results=sv.results.filter(idTest=t)
            result=""
            if(results):
                result=results[0].result_test()
            site.update({sv.version:result})
        tests.update({t.name:site.copy()})
print tests

{u'load stuff': {u'X2': 'Success', u'X1': ''}}
{u'load stuff': {u'XP': 'Error'}}
{u'load stuff': {}}
{u'load stuff': {}, u'unload': {u'X2': 'Fail', u'X1': 'Error'}}
{u'load stuff': {}, u'unload': {u'XP': 'Success'}}
{u'load stuff': {}, u'unload': {}}

x2 и xp являются версиями

Ответы [ 3 ]

3 голосов
/ 15 апреля 2011

Вы уверены, что у вас есть Test и Site объекты, что Site объекты имеют version s, и что каждый siteversion имеет значение для своего свойства version и что онивсе разные?Попробуйте вставить несколько операторов печати для отладки.

Кроме того, такого рода вещи:

site.update({sv.version:result})

излишне неуклюже.Это должно быть:

site[sv.version] = result

(и то же самое с tests).

2 голосов
/ 15 апреля 2011

tests.update({t.name:site.copy()}) выполняется для каждого сайта, но с одним и тем же ключом: testname и иногда у вас есть сайты без теста -> заканчиваются пустым словарем.

, чтобы исправить это, вам нужна следующая структура:

Test1 -> site1 -> test_results1
         site2 -> test_results2
         ...

Test2 -> site1 -> test_results1
         site2 -> test_results2
         ...

примерно так:

tests={}
for t in Test.objects.all():
    sites={}
    for s in Site.objects.all():
        site_results={}
        for sv in s.siteversions.all():
            results=sv.results.filter(idTest=t)
            result = ''
            if(results):
                result=results[0].result_test()
            site_results[sv.version] = result
    sites[s.name] = site_results
tests[t.name] = sites

print tests
1 голос
/ 15 апреля 2011

ну, мне нужна эта структура для создания таблицы, но мне нравится select_related

Я не думаю, что это правда.

Я предполагаю, что ваш models.py - что-то вроде этого:

class Test(models.Model):
  name = models.CharField(unique=True)

class Site(models.Model):
  name = models.CharField(unique=True)

class SiteVersion(models.Model):
  name    = models.CharField()
  site    = models.ForeignKey(Site)
  results = models.ManyToManyField(Test,through='TestResults')
  class Meta:
    unique_together = ((name,site),)

class TestResults(models.Model):
  siteversion = models.ForeignKey(SiteVersion)
  test        = models.ForeignKey(Test)
  class Meta:
    unique_together = ((siteversion,test),)
  def result_test(self):
    # Not sure about this bit, presuming you've got something else on your Test model
    return self.test.XXXX(self.siteversion)

В этом случае вы должны быть в состоянии сделать что-то вроде этого:

table = {}
for r in TestResults.objects.select_related('test__name','siteversion__name','siteversion__site__name'):
  table.setdefault(r.test__name,{}).setdefault(r.siteversion__site__name,{})[r.siteversion__name] = r.result_test()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...