使用Django设计售卖活动门票的网站数据库

3
我正在开发一个售卖活动门票的网站,以下是我的设计: 数据库草图 以下是(为了发布而简化的)模型:
class Event(models.Model):
    name = models.CharField(max_lenght=20)

class Date(models.Model):
    event_start = models.DateTimeField()

    event = models.ForeignKey(Event)

class Ticket_Class(models.Model):
    name = models.CharField(max_lenght=20)
    price = models.IntegerField()

    event = models.ForeignKey(Event)
  1. 我应该如何添加一个Ticket模型?因为一个Ticket是针对特定日期的Event,所以我需要将一个ticket与Event和Date之间的关系相关联。
  2. Ticket_Class还应该有一个“max”字段,其中存储了在特定日期销售该特定Ticket_Class的最大票数。例如:事件“Metallica”有Ticket_Class“Field”和Ticket_Class“VIP”,分别在三个不同的日期上。我如何访问特定日期Ticket_Class剩余票数?也许可以通过计算在Ticket表中与该Event和该日期相对应的Tickets数量来实现。

希望我表达清楚了,英语不是我的母语。随时提出任何疑问。

2个回答

2
我认为你的设计应该是这样的:
class Event(models.Model):
    name = models.CharField(max_lenght=20)

class Date(models.Model):
    event_start = models.DateTimeField()
    event_end= models.DateTimeField()
class Ticket_Class(models.Model):
    name = models.CharField(max_lenght=20)
    price = models.IntegerField()
    type= models.CharField(max_lenght=20)

class EventTicketSell(models.Model):
    event= models.ForeignKey(Event)
    date= models.ForeignKey(Date)
    ticket= models.ForeignKey(Ticket_Class)
    max_sellable_tickets= models.IntegerField()

这种设计的原因是您可以向EventTicketSell类添加事件,然后分配日期和票务,并设置最大可销售票数。

要添加票务/日期/事件:

event1= Event(name= "Lion King")
event1.save()
event2= Event(name= "Metallica")
event2.save()

vip_ticket= Ticket_Class(name='VIP', price= 100, type='VIP')
vip_ticket.save()

evening_show= Date(event_start='Date Object', event_end= 'Date Object') # Date Object is like datetime.datetime.now()
evening_show.save()

concert_ticket_sell= EventTicketSell(event=event1, ticket=vip_ticket, date= evening_show, max_sellable_ticket=500)
concert_ticket_sell.save()

movie_ticket_sell= EventTicketSell(event=event2, ticket=vip_ticket, date= evening_show, max_sellable_tickets=500)
movie_ticket_sell.save()

这个设计将保持对象的可重用性和灵活性以便修改。例如,如果您想更改max_sellable_ticket,则:

movie_ticket_sell= EventTicketSell.objects.filter(event__name='Lion King', date__event_start= datetime.datetime.now(), ticket__type= 'VIP')[0]

movie_ticket_sell.max_sellable_tickets -= form.cleaned_data['ticket_sold'] #for example we get sold count from form

movie_ticket_sell.save()

0

看起来事件需要有一个票数字段来验证最大票数是多少。然后它应该与票务类别建立外键关系。为了确保不超过可用的票数,您可能需要使用类似于清理方法的东西来验证在将票关联到事件时不会超过限制。

https://docs.djangoproject.com/en/1.5/ref/models/instances/#django.db.models.Model.clean

我只是从高层次上看这个问题,可能有些东西我没有考虑到。我也不清楚为什么你不能把日期作为事件的一个字段呢?


因为一个事件可以有多个日期,也许“演出”是一个更好的词。例如,“冰上狮王”这个事件可以在星期五、星期六和星期日有演出。 - Santiago Quiroga

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接