Get_absolute_url очень занятая база данных

Когда я загружаю страницу продукта, я хочу, чтобы на этой странице предлагались другие продукты. Но при генерации абсолютного url для каждого продукта происходит обращение к базе данных. Соответственно, если на странице 10 товаров, то будет + 10 обращений к базе данных. Как можно уменьшить количество запросов к БД? Вот мой код:

models.py

class Goods(models.Model):
    category = models.ForeignKey(Category,
                                 related_name='goods',
                                 on_delete=models.SET_NULL,
                                 null=True)

    name = models.CharField(max_length=150, db_index=True, verbose_name='название')
    slug = models.CharField(max_length=150, db_index=True, unique=True, verbose_name='Слаг')

    def get_absolute_url(self):
    return reverse('goods_detail', kwargs={"category_slug[enter image description here][1]": self.category.slug, "goods_slug": self.slug})

urls.py

path('<slug:category_slug>/<slug:goods_slug>', views.GoodsDetailView.as_view(), name='goods_detail'),

views.py

class GoodsDetailView(DetailView):
    model = Goods
    context_object_name = 'goods'
    slug_url_kwarg = 'goods_slug'

goods_detail.html

{% for i in  goods.ingredients.all%}<br>
    <a href="{{ i.get_absolute_url }}"> {{ i }}</a>
{% endfor %}

* На фото показан пример, если я отображаю 4 объекта на странице

Предполагается, что Ингредиент имеет связь foreignkey с Товарами

В вашем классе views.py вы можете предварительно загрузить информацию, получив дополнительный контекст (см. docs).

def get_context_data(self, **kwargs):
    # Call the base implementation first to get a context
    context = super().get_context_data(**kwargs)
    # Add in a QuerySet of all the ingredients related to this object
    context['ingredients'] = Ingredient.objects.filter(goods = self.get_object())
    return context

тогда вы можете ссылаться на новый контекстный элемент в вашем шаблоне

{% for i in ingredients %}<br>
    <a href="{{ i.get_absolute_url }}"> {{ i }}</a>
{% endfor %}
Вернуться на верх