Django 如何在不循环的情况下筛选项目

Django 如何在不循环的情况下筛选项目,django,django-models,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.appen

有没有更好的查询方法,这样我就不必循环并将用户附加到列表中,因为当项目的长度非常大(比如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)

您可以使用MYSQL连接来连接表,并在无需安排的情况下获得预期的结果。

更新

正如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

您没有提供任何型号的代码
用户
,因此只需在此处猜测:

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

但是,由于您没有筛选项目,因此您实际上只是在查找具有任何
项目的
用户
,因此您可以实际执行以下操作:

user_list = User.objects.filter(users__items__isnull=False)

您可以通过获取所有项目id来实现这一点,然后使用该id使用IN子句(在列表中)过滤用户的id,并对返回的用户使用不同的过滤器。目前我无法直接测试,但下面的内容可以为您提供:

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()
而不是值列表。这可能会导致较大/较慢的查询,请尝试分析它

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

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

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

是的,我知道如何使用sql查询。想知道在Django是否有办法只要检查文档…你会得到的我想magus想要
用户的
第一个对象
引用/拥有
项目的每个对象
。在这里,我们仍然在
循环
用户列表
如果不是
项目
,这仍然很昂贵。“有可能以更便宜的方式完成这项工作吗?”SandipAgarwal不满足AFAIK的要求。需求有点模糊,它没有显示
用户
项目
之间的关系,这可能是一个建模的FK或
整型字段
。此外,queryset
Users.objects.filter(item=item.id)
的顺序对结果很重要。我只是觉得OP可能只需要一些普通的ORM操作,但表达出来会把我们引向另一个方向。假设,如果它是FK,这个解决方案会发生什么变化?你说你知道如何直接在数据库中进行;我的经验是,只要你能用SQL来表达,你就可以用django orm来表达!而最坏的情况,就是这样;但是如果您知道您的SQL查询并想在此处键入它,可能有助于更快地得到答案。在您的解决方案中,它也不是选择
用户的
第一个对象
,而是引用/拥有
项的每个对象
user_list = User.objects.filter(items__id__in=item_ids).order_by('id').distinct('id')