0

我正在使用 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])

(示例代码)如何在每个 writerow 之后清空对象?每个键都是不同的。(没有用 django 创建数据库,实现了我自己的数据库)

所以我想在 Python 中清空对象实例,但不要从数据库中删除信息

亨克斯

编辑:我想清空 Ncbi、Loci 和 Itag 对象。

4

3 回答 3

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 andNCBI will be set to new values if your database method get a record, otherwise they will set toNone`。

编辑2:我希望我理解正确。continue语句用于循环,让您结束当前循环并开始下一个循环(如果可用)。

于 2012-10-01T11:56:20.193 回答
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]将返回一个空列表,或者返回一个包含第一个匹配条目的列表。

于 2012-10-01T11:49:29.743 回答
0

您可以将它们设置None为 for 循环的开头:

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 ''])
于 2012-10-01T11:49:39.977 回答