2016-05-20 6 views
0

すべてのカテゴリを関連する商人および関連する商人の画像とともに表示したいと考えています。これどうやってするの?Django select related

models.py

class Category(models.Model): 
    title = models.CharField(max_length = 50) 
    class Meta: 
     verbose_name_plural = 'Categories' 

class Merchant(models.Model): 
    category = models.ForeignKey('Category', related_name = 'merchants', blank = True, null = True) 
    title = models.CharField(max_length = 100) 

class StoredFile(models.Model): 
    merchant = models.OneToOneField(Merchant, related_name="_image", blank = True, null = True) 

views.py

categories = Category.objects.select_related() 

index.htmlを

{% for category in categories %} 
    {{ category.title }} 
    {% for merchant in category.merchants %} 
     {{ merchant.name }} 
     {{ merchant.image.url }} 
    {% endfor %} 
{% endfor %} 

私のコードは動作しません。

'RelatedManager'オブジェクトは反復不可能です。

私は関連クエリが間違っていると思います。

答えて

1

関連するクエリですが、これはエラーの原因ではありません。他のマネージャと同様に、all()またはfilter()の関連マネージャを使用する必要があるためです。

{% for merchant in category.merchants.all %} 

これは、ビュー内で特別な関連クエリを実行するかどうかに関係なく機能します。この構文はで、常にが利用可能で、select_relatedではありません。はそれ以上の属性にアクセスできます。クエリーをより効率的にするだけです。

しかし、ご使用の場合select_relatedは正しいものではありません。何の効果もありません。これは、フォワードリレーションに対してのみ機能し、カテゴリからマーチャントへのリバースリレーションシップがあるためです。そのためにはprefetch_relatedが必要です。

categories = Category.objects.prefetch_related('merchants') 
+0

しかし、どのようにクエリにフィルタを適用できますか? 'categories = category.objects.filter(merchants__is_active = 1).prefetch_related( 'merchants')'このフィルターは機能しません。 –

+0

なぜあなたはしたいですか?あなたはその質問に言及しなかった。 –

+0

私は自分の質問を更新しました。 –

関連する問題