оптимизировал запросы

This commit is contained in:
Андрей Дувакин 2024-04-21 21:01:22 +05:00
parent 79b88a26bf
commit 8c8b95e839
6 changed files with 72 additions and 28 deletions

View File

@ -17,6 +17,12 @@
<a class="nav-link {% if view_name == 'time_table:main' %} active {% endif %}"
href="{% url 'time_table:main' %}">Расписание</a>
</li>
{% if user.is_authenticated %}
<li class="nav-item">
<a class="nav-link {% if view_name == 'tickets:my_orders' %} active {% endif %}"
href="{% url 'tickets:my_orders' %}">Мои заказы</a>
</li>
{% endif %}
{% endwith %}
</ul>
</div>

View File

@ -0,0 +1,9 @@
{% extends "base.html" %}
{% load static %}
{% load tags %}
{% block title %}
Мои заказы
{% endblock %}
{% block content %}
{% endblock %}

View File

@ -1,10 +1,11 @@
from django.urls import path
from tickets.views import ticket_view, order_success
from tickets.views import ticket_view, order_success, my_orders
app_name = 'tickets'
urlpatterns = [
path('', ticket_view, name='tickets'),
path('order/success', order_success, name='order_success'),
path('my/', my_orders, name='my_orders')
]

View File

@ -1,5 +1,8 @@
from django.contrib.auth.decorators import login_required
from django.shortcuts import render, get_object_or_404
from tickets.models import Order, Ticket
def ticket_view(request):
return render(request, 'tickets/ticket_buy.html')
@ -7,3 +10,16 @@ def ticket_view(request):
def order_success(request):
return render(request, 'tickets/order_success.html')
@login_required
def my_orders(request):
user = request.user
orders = get_object_or_404(
Order.objects.filter(
profile__id=user.profile.id,
).prefetch_related(
'tickets',
)
)
return render(request, 'tickets/my_orders.html')

View File

@ -26,7 +26,12 @@ class FilmSessionsManager(Manager):
def all_timetable(self):
current_datetime = timezone.now()
films_sessions = super().get_queryset().filter(
films_sessions = super().get_queryset().select_related(
'film',
).prefetch_related(
'film__genres',
'film__countries',
).filter(
start_datetime__gte=current_datetime,
).prefetch_related(
FilmSession.film.field.name,

View File

@ -260,42 +260,28 @@ FROM
-- Определим временной промежуток в рамках рабочего времени кинотеатра (8:00 - 22:00)
-- Определим временной промежуток в рамках рабочего дня кинотеатра (10:00 - 22:00)
WITH RECURSIVE session_times AS (
SELECT strftime('%Y-%m-%d %H:%M', 'now', 'start of day', '+8 hours') AS start_time
SELECT strftime('%Y-%m-%d %H:%M', 'now', 'start of day', '+10 hours') AS start_datetime
UNION ALL
SELECT strftime('%Y-%m-%d %H:%M', start_time, '+2 hours') FROM session_times
WHERE start_time < strftime('%Y-%m-%d %H:%M', 'now', 'start of day', '+22 hours')
SELECT strftime('%Y-%m-%d %H:%M', start_datetime, '+2 hours') FROM session_times
WHERE start_datetime < strftime('%Y-%m-%d %H:%M', 'now', 'start of day', '+22 hours')
)
--INSERT INTO timetable_film_sessions (start_datetime, price, auditorium_id, film_id)
-- Вставим сеансы для каждого фильма в каждый зал
INSERT INTO timetable_film_sessions (start_datetime, price, auditorium_id, film_id)
SELECT
CASE
WHEN MAX(end_datetime) IS NULL THEN start_datetime
ELSE MAX(end_datetime)
END AS start_time,
500.00 AS price,
start_datetime,
10.00 AS price, -- Укажите цену билета здесь
auditoriums.id AS auditorium_id,
films.id AS film_id
FROM
session_times
CROSS JOIN
films_films AS films
CROSS JOIN
session_times,
films_films AS films,
timetable_auditoriums AS auditoriums
LEFT JOIN
timetable_film_sessions AS prev_sessions
ON
auditoriums.id = prev_sessions.auditorium_id
AND
prev_sessions.start_datetime <= start_datetime
AND
prev_sessions.start_datetime + (films.duration || ' MINUTES') >= start_datetime
GROUP BY
start_time, auditoriums.id, films.id
ORDER BY
start_time, film_id;
start_datetime, film_id;
@ -345,4 +331,25 @@ INSERT INTO films_countries (name) VALUES
('Испания');
-- Добавление режиссеров к фильмам
INSERT INTO films_films_directors (film_id, director_id)
SELECT f.id AS film_id, d.id AS director_id
FROM films_films AS f
JOIN films_directors AS d ON d.id <= f.id
WHERE f.id BETWEEN 1 AND 40;
-- Добавление актеров к фильмам
INSERT INTO films_films_actors (film_id, actor_id)
SELECT f.id AS film_id, a.id AS actor_id
FROM films_films AS f
JOIN films_actors AS a ON a.id <= f.id
WHERE f.id BETWEEN 1 AND 40;
-- Добавление стран к фильмам
INSERT INTO films_films_countries (film_id, country_id)
SELECT f.id AS film_id, c.id AS country_id
FROM films_films AS f
JOIN films_countries AS c ON c.id <= f.id
WHERE f.id BETWEEN 1 AND 40;