我在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是版本
答案 0 :(得分:3)
您确定拥有Test
和Site
个对象,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()