Django,删除或重置对象但不从数据库中删除

时间:2012-10-01 11:40:27

标签: python django object django-models instance

我正在使用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对象。

3 个答案:

答案 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 ''])