2009-07-29 23 views
0

Djangoモデルの要素が存在するかどうかを調べようとしています。 DjangoのドキュメントのMaking queriesセクションでは、非常に簡単なはずですが、エレガントな方法が見つかりませんでした。要素が存在するかどうかを確認します

私の問題は、ディレクトリ内に何千ものスクリーンショットがあり、それらが保存されるはずのデータベースにあるかどうかを確認する必要があることです。だから、私はファイル名を繰り返して、対応する要素が存在するかどうかを各自に見たいと思っています。 Screenshotというモデルを持っていれば、私が思いつく唯一の方法は、

filenames = os.listdir(settings.SCREENSHOTS_ON_DISC) 
for filename in filenames: 
    exists = Screenshot.objects.filter(filename=filename) 
    if exists: 
     ... 

これを行うにはもっと速く/速い方法がありますか?スクリーンショットはデータベースに2回以上置くことができます(したがって、私は.getを使用しませんでした)。

答えて

2

Screenshotモデルに多くの属性がある場合、あなたが示したコードは、特定の必要性のために不必要な作業を行っています。たとえば、あなたはこのような何かを行うことができます:あなたは、データベース内のすべてのファイル名のリストを与え、ファイル名のみを取得するためにSQLを生成します

files_in_db = Screenshot.objects.values_list('filename', flat=True).distinct() 

を。 Screenshotオブジェクトの作成と移入を試みません。あなたは

files_on_disc = os.listdir(settings.SCREENSHOTS_ON_DISC) 

を持っているなら、あなたは他の会員を探しつのリストを反復処理し、または共通のメンバーを見つけるために、セットに一方または両方のリストを作ることができるなど

1

あなたは試みることができる:あなたが持っていないすべてのスクリーンショットのリストが表示されます

Screenshot.objects.filter(filename__in = filenames) 

を。あなたは2つのリストを比較し、2つのリストの間に何が存在しないかを見ることができます。それで、あなたは始めてみるべきですが、パフォーマンス/使用のためにクエリを微調整したいかもしれません。

1

このクエリでは、あなたのすべてのファイルを取得

discfiles = os.listdir(settings.SCREENSHOTS_ON_DISC) 

filenames = (Screenshot.objects.filter(filename__in=discfiles) 
           .values_list('filename', flat=True) 
           .order_by('filename') 
           .distinct()) 

order_byに注意してください。モデル定義で指図が指定されている場合、distinctを使用すると、期待どおりの結果が返されないことがあります。これは、ここに文書化されています

それでは、クエリを実行し、順序を明示的に。

関連する問題