Django: получить уникальный список объектов из QuerySet - PullRequest
17 голосов
/ 29 сентября 2011

В моем приложении Django есть следующие (упрощенные) модели:

class Color(models.Model):
    name = models.CharField(max_length=10)

class Item(models.Model):
    name = models.CharField(max_length=200)
    color = models.ForeignKey(Color, blank=True, null=True)

class Favorite(models.Model):
    user = models.ForeignKey(User)
    item = models.ForeignKey(Item)

В настоящее время я получаю все нужные мне предметы, используя следующий запрос:

favorites = Favorite.objects.filter(user=request.user)

Как я могу получить все различные цвета для предметов в этом QuerySet?

Мне нужен список реальных цветовых объектов, а не только идентификаторы цветов, которые я могу получить, используя

favorites.values_list('item__color').distinct

Ответы [ 4 ]

29 голосов
/ 29 сентября 2011

Если я вас правильно понимаю, то нужно сделать следующее:

favorites = Favorite.objects.filter(user=request.user)
color_ids = favorites.values_list('item__color', flat=True).distinct()
colors = Color.objects.filter(id__in=color_ids)

Хотя должен быть более чистый путь, чем этот.

Редактировать: Гораздо чище решение:

colors = Color.objects.filter(item__favorite__user=request.user).distinct()
6 голосов
/ 29 сентября 2011

Можете ли вы сделать:

Color.objects.filter(item__favorite__user = request.user).distinct()

Возможно, вам придется установить related_name s для ваших внешних ключей, если это не значения по умолчанию (я никогда не могу вспомнить значения по умолчанию).

3 голосов
/ 07 марта 2016

Можете ли вы сделать:

favorites = Favorite.objects.filter(user=request.user).distinct('item__color')
0 голосов
/ 11 октября 2018

Метод is values_list(*fields, flat=False, named=False), поэтому запустите его на ваших объектах, например:

user.groups.values_list('name', flat=True)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...