【问题标题】:Django: get unique object list from QuerySetDjango:从 QuerySet 获取唯一的对象列表
【发布时间】:2011-11-27 06:55:37
【问题描述】:

我的 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

【问题讨论】:

  • request 中的 request.user 是什么??

标签: django django-queryset


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    你能做到吗:

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

    【讨论】:

    • 完美干净的解决方案
    【解决方案3】:

    你能做到吗:

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

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

    【讨论】:

    • +1 谢谢(上面/下面的清理查询具有正确的语法)。
    【解决方案4】:

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

    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 复杂得多,因此最终选择了答案的第一部分。
    猜你喜欢
    • 2011-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-31
    • 2022-06-22
    • 1970-01-01
    • 2017-10-03
    • 2010-11-21
    相关资源
    最近更新 更多