0

リストがあります:

destinations = test_task.destination_list()- 現在の test_task オブジェクトに割り当てられた国名を含む文字列のリストです。

そして、フィールドを持つテーブルCDRがあります。

id(pk)
number(charfield)
area(charfield).

宛先ごとにエリア = 宛先である CDR テーブルから 3 つの乱数を選択する必要があります。

1つの選択だけを使用してそれを行うことはできますか? または、宛先ごとにループを作成する必要がありますか? 正しい方法はどれですか?

4

2 に答える 2

0

コメントで述べたように、単一のクエリでそれを行う実行可能な方法はないと思います。ループを使用すると、クエリセットのランダム順序付けvalues_list、および " in " 演算子を組み合わせることができます。

final_list = []
for destination in destinations:
    final_list += YourCDRModel.objects.filter(area__in=destination).values_list('number', flat=True).order_by('?')[0:3]

*order_by* ドキュメントに記載されているように、このクエリは遅くなる可能性があり、宛先の数が多い場合はさらに遅くなる可能性があることに注意してください。

于 2013-01-27T19:00:49.707 に答える
0

簡単な方法は、確実に、rand() による各宛先順序付けごとにループとクエリを作成し、3 に制限することです。これを行いたくなく、単一のクエリを実行したい場合、mysql は 3 を返すことができません。単一のクエリを使用して行ごとに結果を取得します。完全なリターンを要求し、結果の数を減らすためのロジックをコードに入れる必要があります。"SELECT * FROM CDR WHERE IN ( ? ,? ... ) ORDER BY RAND() などのクエリを実行すると、型ごとに 3 行になるまで結果がループされます。

目的地の配列が大きすぎない場合は、すべての可能な結果を​​選択してコードでループするのではなく、目的地にループして各目的地ごとにクエリすることをお勧めします。

于 2013-01-27T19:05:40.877 に答える