具有多个条件的Django模型制作

时间:2019-09-17 05:38:44

标签: django django-models

我正在开发用于电影院座位预订的应用程序,但遇到了麻烦,设计了我的models

这是我目前的型号:

from django.db import models
from django.contrib.auth import get_user_model

class Seats(models.Model):
    seat_choice = (
        ('AA', 'AA'),
        ('AB', 'AB'),
        ('BA', 'BA'),
        ('BB', 'BB'),
        ('CA', 'CA'),
        ('CB', 'CB')
    )
    name = models.CharField(choices=seat_choice, max_length=2)

    def __str__(self):
        return self.name

class Show(models.Model):
    show_choice  = (
        ('MORNING', 'MORNING'),
        ('NIGN', 'NIGHT'),
    )
    show_schedule = models.CharField(choices=show_choice, max_length=10)
    movie = models.CharField(max_length=50)

class Booking(models.Model):
    seat = models.OneToOneField(Seats, on_delete=models.CASCADE)
    user = models.ForeignKey(get_user_model(), on_delete=models.CASCADE)
    show = models.ForeignKey(Show, on_delete=models.CASCADE)

    class Meta:
        db_table = 'booking_booking'
        constraints = [
            models.UniqueConstraint(fields=['seat', 'show'], name='unique booking')
        ]

我试图实现的目标是,如果预订了某个演出的座位,以后就不能再次预订,但是以后可以再预定另一个演出。

但是我当前的模特问题是:如果我预定一个演出的座位,我不能预定同一座位的另一个演出(这是我不想的)

我的要求很简单:如果我为某个演出预定座位,以后我应该可以为另一个不同的演出预定同一个座位,但是不能为同一演出再次预定...

我知道我可以实现删除演出并使用如下所示的创建方式:

class Booking(models.Model):
    seat = models.OneToOneField(Seats, unique_for_date='created', on_delete=models.CASCADE)
    user = models.ForeignKey(get_user_model(), on_delete=models.CASCADE)
    created = models.DateField(auto_now_add=True)

但是我不想这样。我需要尽一切可能保持表演场……

1 个答案:

答案 0 :(得分:0)

由于您与Seat的关系,目前每个OneToOne只能进行一次预订:

class Booking(models.Model):
     seat = models.OneToOneField(Seats, on_delete=models.CASCADE)

将其更改为ForeignKey,以便一个Seat可以与多个Booking相关联:

 seat = models.ForeignKey(Seats, on_delete=models.CASCADE)