【问题标题】:Django ORM better way to manipulate django ORM queryDjango ORM 操作 django ORM 查询的更好方法
【发布时间】:2021-12-19 16:28:28
【问题描述】:

以下是型号:

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

模型说明:

一个大厅有多个座位

每个大厅举办多场演出

每个预订基本上都是一张带有特定座位和特定节目的演出门票。

要求是获得一个查询集,其中包含特定节目的预订表中不存在的所有座位。 基本上,通过检查预订表中不存在的可用座位列表来获取演出的可用座位列表

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)

【问题讨论】:

    标签: python django django-models django-views django-orm


    【解决方案1】:

    您可以通过以下方式获得这些Seats:

    Seat.objects.filter(<strong>hall=hid</strong>).exclude(<strong>booking__show=spk</strong>)

    这将检索给定Hall 对象hid 的所有Seats,其中没有ShowBookingspk 对象确定。

    【讨论】:

    • 非常感谢,效果很好。 booking 在这里代表什么?它不是 Seat 模型中的字段,也不是 show 模型中的字段?该模型也称为 Booking
    • @akashdeep:如果你定义一个ForeignKey,Django 定义一个反向的关系。默认情况下,它使用related_query_name 以小写形式定义模型的名称,因此您可以使用booking 在查询中访问相关预订。
    猜你喜欢
    • 1970-01-01
    • 2020-12-03
    • 2014-06-13
    • 2021-07-25
    • 1970-01-01
    • 2017-08-24
    • 2011-06-15
    • 2018-05-21
    相关资源
    最近更新 更多