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 join 来连接表并获得预期结果而无需迭代。

于 2012-06-11T06:20:05.380 回答
0

尝试:

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

但是,由于您没有过滤项目,因此您实际上只是在寻找Usershave any Item,因此您实际上可以这样做:

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

您可以通过获取所有项目 ID 来实现这一点,然后使用它来过滤带有 IN 子句(在列表中)的用户,并在返回的用户上使用不同的过滤器。我目前无法直接测试,但类似以下内容应该可以为您执行此操作:

item_ids = Item.objects.all().values_list('id', flat=True) # Get a list of Item id's values, since you don't need the whole Item object

user_list = User.objects.filter(items__id__in=item_ids).distinct('id') #Distinct on user id/username, filtered on those users matching an item id

user_list = list( user_list ) # Convert to a list

注意:您可以Item.objects.all()直接使用而不是 values_list。这可能会导致更大/更慢的查询,请尝试对其进行分析。

如果这不能解决问题,您可能需要添加更清晰的描述,准确描述您希望在输出中看到的内容。您正在执行选择并获取出现的第一个值(通常这将是数据库中的第一个值)。您可以通过在 distinct 之前进行排序来模拟上述内容:

user_list = User.objects.filter(items__id__in=item_ids).order_by('id').distinct('id')

如果这是您经常要做的事情,一个更快的解决方案可能是向名为 first_user 的项目记录添加另一个字段,该字段是在通过保存挂钩添加第一个用户时设置的。

于 2013-04-11T13:32:07.993 回答