mod: tune item navigation queries

This commit is contained in:
2026-04-10 13:46:41 +03:00
parent dc84178eba
commit e71a5aaa0a
2 changed files with 14 additions and 8 deletions

View File

@@ -247,4 +247,11 @@ class TbContent(models.Model):
class Meta:
verbose_name = "Контент"
verbose_name_plural = u"Контент"
# Если боковая навигация или лента начнут упираться в SQLite, сюда можно
# добавить составные индексы. Пока оставляем это как подсказку, чтобы не
# менять схему базы без замеров.
# indexes = [
# models.Index(fields=['bContentPublish', 'tdContentPublishUp']),
# models.Index(fields=['bContentPublish', 'tdContentPublishDown']),
# ]
ordering = ['-tdContentPublishUp', ]

View File

@@ -154,20 +154,19 @@ def show_item(request,
if not q_item.bContentPublish:
raise Http404("Контент не опубликован")
to_template["ITEM"] = q_item
# query = Q(tdContentPublishDown__isnull=True)
# query.add(Q(tdContentPublishDown__gt=timezone.now()), Q.OR)
# query.add(Q(bContentPublish=True), Q.AND)
# query.add(Q(tdContentPublishUp__lte=q_item.tdContentPublishUp), Q.AND)
now_value = timezone.now()
# Фрмируем список заголовков для боковой навигации
# Два запроса, т.к. это проще и "дешевле" чем городить один запрос и после делить его срезами.
q_items_after = TbContent.objects.filter(
Q(tdContentPublishDown__isnull=True) | Q(tdContentPublishDown__gt=timezone.now()),
Q(tdContentPublishDown__isnull=True) | Q(tdContentPublishDown__gt=now_value),
Q(bContentPublish=True),
Q(tdContentPublishUp__lte=q_item.tdContentPublishUp)
).order_by("-tdContentPublishUp", "id")[:settings.NUM_NAV_ITEMS_IN_PAGE / 2]
).only("id", "szContentHead", "szContentSlug", "tdContentPublishUp").order_by("-tdContentPublishUp", "id")[:settings.NUM_NAV_ITEMS_IN_PAGE // 2 + 1]
q_items_before = TbContent.objects.filter(
Q(tdContentPublishDown__isnull=True) | Q(tdContentPublishDown__gt=timezone.now()),
Q(tdContentPublishDown__isnull=True) | Q(tdContentPublishDown__gt=now_value),
bContentPublish=True,
tdContentPublishUp__gt=q_item.tdContentPublishUp
).order_by("tdContentPublishUp", "id")[:settings.NUM_NAV_ITEMS_IN_PAGE / 2 - 1]
).only("id", "szContentHead", "szContentSlug", "tdContentPublishUp").order_by("tdContentPublishUp", "id")[:settings.NUM_NAV_ITEMS_IN_PAGE // 2]
try:
p = 0 if "p" not in request.GET else int(request.GET["p"])
n = 0 if "n" not in request.GET else int(request.GET["n"])