2012-01-14 14 views
1

私はRedisから出てくるオブジェクトIDのリストを持っており、それらをDjangoモデルオブジェクト(またはQuerySet)のリストに変換したいと思います。結果はリストと同じ順序でなければなりません。現在、各IDに対してgetを繰り返し実行しています。私はそれが特に効率的だとは思わない。idsのリストで順序付けられたdjangoオブジェクトを選択する最適な方法は何ですか?

Djangoにはin_bulkがありますが、それは順序を保持しません。

リストのサイズは10〜200アイテムです。あなたが必要なもの

+0

IDで番号順に並べ替えしますか?または、あなたが保存したい特定の順序がありますか? –

+0

私はそれらをリストの順にしたい。私の質問を振り返ってみると、それは明白ではありませんでした。編集されました。 – Joe

答えて

3

Manager.in_bulkはただの辞書を返すので、特定の順序を持​​つようにそれを強制する方法はありませんされています。あなたが望むすべてがID順IDのリストを、一致するオブジェクトのリストである場合

、その後、次の操作を行います。

id_list = [1, 2, 3, 10, 11, 12] 
results = MyModel.objects.filter(id__in=id_list).order_by('id') 

それは.in_bulk()ほど効率的ではないかもしれないが、それは照会よりも多くの方が良いでしょう一つずつ。

非常に具体的な注文が必要な場合は - 「Redisが返す順序で」 - それを行うためのデータベース自体を取得する方法はありません。その性質上、リレーショナル・データベースは、順序付けを適用しない限り、順序付けられていない行セットを戻しますが、その順序付けはデータベースのフィールドに基づいている必要があります。

その時点での最善の策は、それから、IDをキーと、オブジェクトの辞書を取得するために.in_bulk()を使用して、あなたが必要とするために、リストを構築するためにその辞書に検索を行うことです。

編集:結果を並べ替える場合は、要求されたIDの一部がデータベースから返されなかった可能性があることを控えてください。 results.get(id、None)を使用すると、辞書に安全にインデックスを付けることができ、filter()を使用して空の項目をリストから削除することができます。

id_list = [10, 11, 12, 1, 2, 3] 

# Get all of the items from the database 
results = MyModel.objects.in_bulk(id_list) 

# re-order the results into the order specified by id_list 
ordered_results = [results.get(id,None) for id in id_list] 

# remove None items from the ordered results 
filtered_results = filter(None, ordered_results) 
0

in field lookp

Model.objects.filter(pk__in = ID_LIST)

+1

これは順序を保持していますか?私はそうは思わない。 – Joe

+0

それはしません。データベースの自然順序付け(またはモデルで定義したもの)でそれらを返します。 - クライアント側を並べ替える必要があります。上記の私の答えを参照してください。 –

関連する問題