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
私があなたを正しく理解していれば、次のことがうまくいくはずです。
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()
できますか:
Color.objects.filter(item__favorite__user = request.user).distinct()
いくつか設定する必要があるかもしれませんrelated_name
sこれらがデフォルトではない場合、外部キーを使用します(デフォルトを思い出せません)。
できますか:
favorites = Favorite.objects.filter(user=request.user).distinct('item__color')
Isはvalues_list(*fields, flat=False, named=False)
メソッドなので、オブジェクトで実行します。次に例を示します。
user.groups.values_list('name', flat=True)