Где я могу эффективно получить доступ к полям модели, используя объект модели для оптимизации запросов Django - PullRequest
0 голосов
/ 12 июня 2019

У меня есть модель с именем 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)

Есть ли способ лучше сохранить плюсы двух способов? Похоже, второй путь его БД меньше, чем первый, но не уверен, что я подхожу к лучшему. Есть идея получше?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...