У меня есть модель с именем Store
. Другие модели, такие как Image
, Promotion
, Keyword
, обозначают Store
с ForeignKey
или ManyToManyField
. Я запутался, какой уровень наиболее эффективен для доступа к полям Store
между уровнем шаблона HTML или уровнем views.py.
-------------------------------------------- -------------------------------------------------- --------------------------------------
Уровень шаблона HTML , в основном, передается только store
объект. Все поля в store
ojbect доступны через объект в шаблонах HTML. Для меня, я чувствую, что этот способ имеет лучше организованный код. Поскольку мне не нужно обрабатывать все поля, мне нужно отдельно одно за другим в views.py.
HTML
<h1>{{ store.name }}</h1>
{% for img in store.image_set.all %}
{% if forloop.counter < 5 %}
...Do something with img
{% endif %}
{% endfor %}
{% for keyword in store.keyword_set.all %}
...Do something with keyword
{% endfor %}
{% for promo in store.promotion_set.all %}
...Do something with promo
{% endfor %}
views.py
class StoreDetailView(View):
def get(self, request, *args, **kwargs):
...
store_id = self.kwargs['store_id']
store = Store.objects.get(id=store_id)
store_images = store.image_set.all()
...
context = {
'store': store,
'store_images': store_images,
}
return render(request, template, context)
-------------------------------------------- -------------------------------------------------- --------------------------------------
views.py level , в отличие от описанного выше способа, store
объект не нужно передавать непосредственно в шаблон. Вместо этого создается объект store
для доступа к полям в views.py. Этот способ не требует фильтрации или обработки на уровне шаблона, но кажется, что нехорошо обрабатывать и передавать каждое поле по одному. Я могу просто передать объект store
и выполнить какие-либо действия с шаблоном.
HTML-шаблоны
<h1>{{ name }}</h1>
{% for img in images %}
...Do something with img
{% endfor %}
{% for keyword in keywords %}
...Do something with keyword
{% endfor %}
{% for promo in promotions %}
...Do something with promo
{% endfor %}
views.py
class StoreDetailView(View):
def get(self, request, *args, **kwargs):
...
store_id = self.kwargs['store_id']
store = Store.objects.prefetch_related('image_set', 'keyword_set', 'promotion_set').get(id=store_id)
images = store.image_set.all()[:5]
keywords = store.keyword_set.all()
promotions = store.promotion_set.all()
...
context = {
'images': images,
'keywords': keywords,
'promotions': promotions,
}
return render(request, template, context)
Есть ли способ лучше сохранить плюсы двух способов? Похоже, второй путь его БД меньше, чем первый, но не уверен, что я подхожу к лучшему. Есть идея получше?