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