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

32

我在我的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,我可以使用以下方法来获取颜色ID:

favorites.values_list('item__color').distinct

request.user 中的 request 是什么? - Shayan
4个回答

49

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

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 谢谢。实际上,原始查询比 user=request.user 复杂得多,所以最终采用了您答案的第一部分。 - rolling stone

8

Can you do:

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

完美而干净的解决方案 - Trupti M Panchal
仅适用于PostgreSQL。 - LennyLip

8

你能够做以下任务吗:

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

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


+1 谢谢(上面/下面的清理过的查询具有正确的语法)。 - rolling stone

0

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接