3

項目の長さが 10000 と非常に大きい場合、10000 回クエリを実行する必要があるため、ユーザーをループしてリストに追加する必要がないようにクエリを実行するより良い方法はありますか。それを回避する方法はありますか?

user_list = []
items = Items.objects.all()
for item in items:  
        userobjects = Users.objects.filter(item=item.id)
        user = userobjects[0].user
        user_list.append(user)
4

4 に答える 4

1

アップデート

Sandip Agarwalが指摘したように、最初のものだけが必要な場合は、簡単なSQL AFAIKはありません。パフォーマンスのために、私はそれを好きです

user_list = []
cur = None
# If there is customized ordering, 
# you could put the customization after 'item' in the following code
for user in Users.objects.filter(item__isnull=False).order_by('item').iterator():
    if cur != user.item_id:
        user_list.append(user)
        cur = user.item_id

Itemモデルとのコードを提供していないUserので、単純に次のように推測します。

User.objects.filter(item__isnull=False)   
# or 
User.objects.filter(item__in=Items.objects.all())
于 2012-06-11T07:34:43.940 に答える
0

MYSQL結合を使用してテーブルを結合し、反復せずに期待される結果を得ることができます。

于 2012-06-11T06:20:05.380 に答える
0

試す:

user_list = User.objects.filter(users__items__in=Items.objects.all())

Usersただし、アイテムをフィルタリングしていないため、実際にはhave anyを探しているだけなItemので、実際には次のことができます。

user_list = User.objects.filter(users__items__isnull=False)
于 2012-06-11T14:34:32.940 に答える