2016-05-20 3 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

Связанный запрос is не правильный, но это не является причиной вашей ошибки. Это потому, что вам нужно использовать связанного менеджера с all() или filter(), как и любой другой менеджер.

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

Обратите внимание, что это работает независимо от того, выполняете ли вы какие-либо специальные связанные запросы в представлении; этот синтаксис составляет всегда в наличии, и select_related делает не дает доступ к любым атрибутам. Все, что он делает, делает запрос более эффективным.

Однако в вашем случае select_related даже не правильная вещь для использования; это не будет иметь никакого эффекта. Это потому, что он работает только для форвардных отношений, и у вас есть обратные отношения из категории в Merchant. Для этого вам нужно prefetch_related.

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

Но как я могу применить фильтр к запросу? 'categories = Category.objects.filter (merchants__is_active = 1) .prefetch_related ('merchants')' этот фильтр не работает. –

+0

Зачем ты хочешь? Вы не упомянули об этом в вопросе. –

+0

Я обновил свой вопрос. –