Django:从QuerySet获取唯一对象列表

时间:2011-09-28 23:05:58

标签: django 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项目的所有不同颜色?

我需要一个实际颜色对象的列表,而不仅仅是颜色ID,我可以使用

favorites.values_list('item__color').distinct

4 个答案:

答案 0 :(得分:29)

如果我理解正确,以下应该可以解决问题:

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

答案 1 :(得分:6)

你能做到:

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

如果这些不是默认设置,您可能需要在外键上设置一些related_name(我永远不会记住默认设置)。

答案 2 :(得分:3)

你能做到:

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

答案 3 :(得分:0)

这是values_list(*fields, flat=False, named=False)方法,因此请在您的对象上运行它,例如:

user.groups.values_list('name', flat=True)