2011-09-28 8 views
14

から一意のオブジェクトの一覧を取得する:ジャンゴ:私は私の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のアイテムのすべての色を取得するにはどうすればよいですか?

は私が正しくあなたを理解していれば、私は

favorites.values_list('item__color').distinct 

答えて

20

を使用して得ることができ、実際の色オブジェクトのリストだけでなく、色のIDを、必要とする、トリックを行う必要があり、次の

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() 
+0

+1感謝を。実際の元のクエリは実際には 'user = request.user'よりもはるかに複雑であったので、答えの最初の部分に行くことになりました。 –

6

はあなたが行うことができます。これらは、デフォルトでない場合

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

をあなたの外部キーにいくつかのrelated_name秒を設定する必要があります(私はデフォルトを思い出すことはできません)。

+0

+1ありがとうございます(上記のクリーンアップされたクエリには正しい構文があります)。 –

0

あなたが行うことができます。

favorites = Favorite.objects.filter(user=request.user).distinct('item__color') 
関連する問題