web-dev-qa-db-ja.com

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
22
rolling stone

私があなたを正しく理解していれば、次のことがうまくいくはずです。

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()
37
John Keyes

できますか:

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

いくつか設定する必要があるかもしれませんrelated_namesこれらがデフォルトではない場合、外部キーを使用します(デフォルトを思い出せません)。

7
Dave

できますか:

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

Isはvalues_list(*fields, flat=False, named=False)メソッドなので、オブジェクトで実行します。次に例を示します。

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