Django: получить уникальный список объектов из QuerySet

В моем приложении 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

Ответы

Ответ 1

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

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()

Ответ 2

Вы можете:

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

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

Ответ 3

Вы можете:

favorites = Favorite.objects.filter(user=request.user).distinct('item__color')