您可以通过获取所有项目 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 的项目记录添加另一个字段,该字段是在通过保存挂钩添加第一个用户时设置的。