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

rol*_*one 22 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)
Run Code Online (Sandbox Code Playgroud)

我目前正在使用以下查询获取所需的所有项目:

favorites = Favorite.objects.filter(user=request.user)
Run Code Online (Sandbox Code Playgroud)

如何获得该项中所有不同颜色的颜色QuerySet

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

favorites.values_list('item__color').distinct
Run Code Online (Sandbox Code Playgroud)

Joh*_*yes 37

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

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)
Run Code Online (Sandbox Code Playgroud)

必须有一个比这更清洁的方式.

编辑:更清洁的解决方案:

colors = Color.objects.filter(item__favorite__user=request.user).distinct()
Run Code Online (Sandbox Code Playgroud)


小智 7

你可以做:

favorites = Favorite.objects.filter(user=request.user).distinct('item__color')
Run Code Online (Sandbox Code Playgroud)


Dav*_*ave 6

你可以做:

Color.objects.filter(item__favorite__user = request.user).distinct()
Run Code Online (Sandbox Code Playgroud)

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