是否有更好的查询方式,以便我不必循环并将用户追加到列表中,因为当项目的长度非常大时说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)
答案 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
您尚未提供任何型号代码Item
和User
,因此请在此处猜测:
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记录中添加另一个字段,该记录是在通过保存挂钩添加第一个用户时设置的。