You можно добиться этого, получив при этом все идентификаторы Item, чтобы отфильтровать User с предложением 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. Это может привести к большему/медленному запросу, попробуйте профилировать его.
Если это не решит вопрос, возможно, вам потребуется добавить более четкое описание того, что именно вы хотите видеть в выходе. Вы делаете выбор и берете первое значение, которое выходит (обычно это будет первый в базе данных). Вы можете быть в состоянии подражать, что с выше сортировкой перед тем различны:
user_list = User.objects.filter(items__id__in=item_ids).order_by('id').distinct('id')
Если это то, что вы собираетесь сделать много, более быстрым решением может быть добавить еще одно поле для записи товара под названием first_user, который устанавливается, когда первый пользователь добавляется через крюк сохранения.
Вы говорите, что знаете, как это сделать непосредственно в базе данных; и мой опыт в том, что пока вы можете выразить это в SQL, вы можете сделать это с помощью django orm! И в худшем случае, [raw sql] (https://docs.djangoproject.com/en/dev/topics/db/sql/) существует для него; но если вы знаете свой SQL-запрос и чувствуете, что ввод его здесь может помочь получить ответ быстрее. – Stefano