如何在不循环的情况下过滤项目

时间:2012-06-11 06:12:23

标签: django django-models

是否有更好的查询方式,以便我不必循环并将用户追加到列表中,因为当项目的长度非常大时说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 个答案:

答案 0 :(得分: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

您尚未提供任何型号代码ItemUser,因此请在此处猜测:

User.objects.filter(item__isnull=False)   
# or 
User.objects.filter(item__in=Items.objects.all())

答案 1 :(得分:0)

您可以使用MYSQL连接来连接表并获得预期的结果,而无需进行操作。

答案 2 :(得分:0)

尝试:

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

但是,由于您没有过滤这些项目,因此您实际上只是在寻找有Users的{​​{1}},所以您实际上可以这样做:

Item

答案 3 :(得分: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。这可能会导致更大/更慢的查询,尝试对其进行分析。

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

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

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