Django ORM лучший способ манипулирования запросами django ORM

Ниже представлены модели:

class Seat(models.Model):
    hall = models.ForeignKey(Hall,on_delete=CASCADE)
    type = models.TextField(verbose_name="Seat Type")

class Show(models.Model):
    show_time = models.TimeField(verbose_name='Show Time')
    movie = models.ForeignKey(Movie,on_delete=CASCADE)
    hall = models.ForeignKey(Hall,on_delete=CASCADE)
    cinema = models.ForeignKey(Cinema,on_delete=CASCADE)

class Booking(models.Model):
    seat = models.ForeignKey(Seat,on_delete=CASCADE)
    show = models.ForeignKey(Show,on_delete=CASCADE)
    movie = models.ForeignKey(Movie,on_delete=CASCADE)
    hall = models.ForeignKey(Hall,on_delete=CASCADE)
    cinema = models.ForeignKey(Cinema,on_delete=CASCADE)
    user = models.ForeignKey(User, verbose_name="Username", on_delete=DO_NOTHING) # donothing

Объяснение моделей:

Много мест в зале

В каждом зале проходит несколько шоу

Каждое бронирование - это, по сути, билет на шоу с конкретным местом и конкретным шоу.

Требуется получить набор запросов, содержащий все места, отсутствующие в таблице бронирования для определенного шоу. По сути, получить список доступных мест для шоу, проверив, что они отсутствуют в таблице Bookings

SQL-запрос будет выглядеть следующим образом:

SELECT * FROM Seat as S join Show as Sh on S.hall = Sh.hall join Bookings as B on B.show = Sh.id where Sh.id = 1 AND B.seat IS NULL

как преобразовать это в Django ORM:

можно сделать это следующим образом (есть ли лучший способ, чем создание списка seat_id_list?):

            qs = Seat.objects.filter(hall=hid) #----------------------------------
            show_bookings = Booking.objects.filter(show=spk)
            seat_id_list = []

            for each_booking in show_bookings:
                print(each_booking.seat.id)
                seat_id_list.append(each_booking.seat.id)
            qss = Seat.objects.exclude(id__in = seat_id_list)

Вы можете получить эти Seat с помощью:

Seat.objects.filter(hall=hid).exclude(booking__show=spk)

Это позволит получить все Seat для данного Hall объекта hid, где нет Booking для Show, определяемого spk объектом.

Вернуться на верх