我正在使用django,我正在迭代不同键的列表, 现在每个键我想写一些东西到文件,所以我按键获取对象。像:
for ids in Idlist:
try:
Loci = Locus.objects.get(Gen_ID=ids)
except:
#no locus info found
pass
try:
Itag = Itag_annotatie.objects.get(Gen_ID=ids)
except:
#no Itag info found
pass
try:
Ncbi = NCBI.objects.get(Gen_ID=ids)
except:
#No NCBI info found
pass
writer.writerow([Itag.Gen_ID, Itag.Solyc, Ncbi.defname, Loci.Lociname])
(示例代码) 如何在每个写作后清空对象? 每个关键都不一样。 (没有使用django创建数据库,实现了我自己的数据库)
所以我想在Python中使用Instance对象,但不要删除数据库中的信息
亨克斯
编辑:我想清空Ncbi,Loci和Itag对象。
答案 0 :(得分:1)
首先,你的做法是错误的,
try:
Loci = Locus.objects.get(Gen_ID=ids)
except:
#no locus info found
pass
如果没有Gen_ID=ids
的数据,那么您的变量Loci
将不会被创建(如果您之前没有初始化它),那么,
writer.writerow([Itag.Gen_ID, Itag.Solyc, NCBI.defname, Loci.Lociname])
将引发错误,因为Loci
根本没有创建。
至于问题的答案,您可以将其设置为None
writer.writerow([Itag.Gen_ID, Itag.Solyc, NCBI.defname, Loci.Lociname])
Loci = None
Itag = None
NCBI = None
但如果您的None
函数没有返回记录,则将它们设置为get
是更好的方法
for ids in Idlist:
try:
Loci = Locus.objects.get(Gen_ID=ids)
except Locus.DoesNotExist:
#no locus info found
Loci = None
try:
Itag = Itag_annotatie.objects.get(Gen_ID=ids)
except Itag_annotatie.DoesNotExist:
#no Itag info found
Itag = None
try:
Ncbi = NCBI.objects.get(Gen_ID=ids)
except NCBI.DoesNotExist:
#No NCBI info found
Ncbi = None
if not Loci:
continue # end this loop without doing anything else and start the next loop
writer.writerow([Itag.Gen_ID if Itag else '',
Itag.Solyc if Itag else '',
Ncbi.defname if Ncbi else '',
Loci.Lociname # can not be `None`
])
编辑:通常,Loci,
Itag and
NCBI will be set to new values if your database method get a record, otherwise they will set to
无`。
编辑2:我希望我理解正确。循环中使用continue
语句,让您结束当前循环并启动下一个循环(如果可用)。
答案 1 :(得分:0)
在你的位置,我会在一个单独的函数中创建每个对象的处理代码:
def write(ids):
try:
Loci = Locus.objects.get(Gen_ID=ids)
except Locus.DoesNotExist:
Loci = None
try:
Itag = Itag_annotatie.objects.get(Gen_ID=ids)
except Itag.DoesNotExist:
Itag = None
try:
Ncbi = NCBI.objects.get(Gen_ID=ids)
except Ncbi.DoesNotExist:
Ncbi = None
writer.writerow([Itag.Gen_ID if Itag else None,
Itag.Solyc if Itag else None,
Ncbi.defname if Ncbi else None,
Loci.Lociname if Loci else None])
for ids in Idlist:
write(ids)
在这种情况下,变量是本地的,不需要重置。
另一个(更干净)的变体:
for ids in Idlist:
Locis = Locus.objects.filter(Gen_ID=ids)[:1]
Itags = Itag_annotatie.objects.filter(Gen_ID=ids)[:1]
Ncbis = NCBI.objects.filter(Gen_ID=ids)[:1]
writer.writerow([Itags[0].Gen_ID if Itags else None,
Itags[0].Solyc if Itags else None,
Ncbis[0].defname if Ncbis else None,
Locis[0].Lociname if Locis else None])
Foobar.objects.filter(Gen_ID=ids)[:1]
之类的查询集将返回一个空列表(如果找不到)或带有第一个匹配条目的列表。
答案 2 :(得分:0)
您可以在for循环的开头将它们设置为None
:
for ids in Idlist:
Loci = None
Itag = None
Ncbi = None
try:
Loci = Locus.objects.get(Gen_ID=ids)
except:
#no locus info found
pass
....
#your for loop
....
# use attributes if objects found, else use ''
writer.writerow([Itag.Gen_ID if Itag else '',
Itag.Solyc if Itag else '',
Ncbi.defname if Ncbi else '',
Loci.Lociname if Loci else ''])