python dict在迭代后结束为空

时间:2011-04-15 09:29:43

标签: python django dictionary

我在python中使用dict时遇到问题,我最后得到的是空字典。

看起来我每次删除数据

此代码假设生成包含每个站点测试的测试。

提前致谢

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 个答案:

答案 0 :(得分:3)

您确定拥有TestSite个对象,Site个对象有version个,并且每个siteversion都有它的version属性的值是多少?尝试输入一些打印语句进行调试。

此外,这类事情:

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

不必要地笨拙。它应该是:

site[sv.version] = result

(与tests相同)。

答案 1 :(得分:2)

tests.update({t.name:site.copy()})是针对每个网站执行的,但使用相同的密钥:testname和somtimes,你有网站无法测试 - >最后是空字典。

要解决此问题,您需要一个如下所示的结构:

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

答案 2 :(得分:1)

  

我需要用于制作表格的结构,但我确实喜欢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()