いくつかのクエリを作成して、Django モデル オブジェクトのリストを作成します。次に、重複を削除したいのですが (これらのオブジェクトはすべて auto_increment int PK を持つ同じタイプです)、set() はハッシュ可能ではないため使用できません。
これを行うための迅速かつ簡単な方法はありますか?IDをキーとするリストの代わりにdictを使用することを検討しています。
いくつかのクエリを作成して、Django モデル オブジェクトのリストを作成します。次に、重複を削除したいのですが (これらのオブジェクトはすべて auto_increment int PK を持つ同じタイプです)、set() はハッシュ可能ではないため使用できません。
これを行うための迅速かつ簡単な方法はありますか?IDをキーとするリストの代わりにdictを使用することを検討しています。
一般に、可能であれば、すべてのクエリを1つのクエリにまとめることをお勧めします。つまり。
q = Model.objects.filter(Q(field1=f1)|Q(field2=f2))
それ以外の
q1 = Models.object.filter(field1=f1)
q2 = Models.object.filter(field2=f2)
最初のクエリが重複したモデルを返す場合は、distinct()を使用します
q = Model.objects.filter(Q(field1=f1)|Q(field2=f2)).distinct()
クエリを1つのコマンドで実行することが本当に不可能な場合は、他の回答で推奨されているdictまたは他の手法を使用する必要があります。正確なクエリをSOに投稿し、単一のクエリに結合できるかどうかを確認できれば役立つ場合があります。私の経験では、ほとんどのクエリは単一のクエリセットで実行できます。
これを行うための迅速かつ簡単な方法はありますか?IDをキーとするリストの代わりにdictを使用することを検討しています。
いくつかのクエリを作成する現在の構造に閉じ込められている場合は、まさにそれを行います。次に、単にdictionary.values()
リストを返します。
もう少し柔軟性があれば、Q
オブジェクトを使用してみませんか? 実際にクエリを作成する代わりに、各クエリをQ
オブジェクトに格納し、ビットごとの or ("|") を使用して単一のクエリを実行します。これにより、目標が達成され、データベース ヒットが節約されます。
モデル定義に関数を追加し__hash__
て id を返す場合は、セットを使用できます (これがアプリ内の他のハッシュ動作に干渉しないことを前提としています)。
class MyModel(models.Model):
def __hash__(self):
return self.pk
順序が重要でない場合は、辞書を使用してください。
私はこれを使用します:
dict(zip(map(lambda x: x.pk,items),items)).values()
「重複」の削除は、「重複」の定義方法によって異なります。
すべての列 (PK を除く) を一致させたい場合、それは首の痛みです。多くの比較が必要です。
一方、「自然キー」列 (または列の短いセット) がある場合は、これらを簡単にクエリして削除できます。
master = MyModel.objects.get( id=theMasterKey )
dups = MyModel.objects.filter( fld1=master.fld1, fld2=master.fld2 )
dups.all().delete()
重複識別のためのいくつかの短いキー フィールドのセットを識別することができれば、これはかなりうまく機能します。
編集
モデル オブジェクトがまだデータベースに保存されていない場合は、これらのキーのタプルで辞書を作成できます。
unique = {}
...
key = (anObject.fld1,anObject.fld2)
if key not in unique:
unique[key]= anObject