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])

Queryset likeFoobar.objects.filter(Gen_ID=ids)[:1]は、見つからない場合は空のリストを返すか、最初に一致したエントリのリストを返します。

于 2012-10-01T11:49:29.743 に答える
0

Nonefor ループの開始時にそれらを設定できます。

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 に答える