网站中的数据库设计,用于销售Django事件的门票

时间:2014-08-25 13:31:53

标签: database django database-design django-models

我正在一个销售活动门票的网站上工作。我有以下设计:

Database draft

(简化发布)模型:

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. 我应该如何添加故障单模型?因为票证是针对特定日期的事件,所以我需要将票证与事件和日期之间的关系相关联
  2. Ticket_Class也应该有一个" max"存储在特定日期可用于销售特定Ticket_Class的最大票证的字段。例如:Event" Metallica"有Ticket_Class" Field"和Ticket_Class" VIP",在三个不同的日期。如何在特定日期访问Ticket_Class的剩余票数?也许计算Ticket表中与该日期的事件相对应的票数。
  3. 我希望自己说清楚,英语不是我的第一语言。随意提出任何疑问

2 个答案:

答案 0 :(得分: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类添加事件,然后使用max sellable ticket分配日期和票证。

用于添加票证/日期/事件:

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()

答案 1 :(得分:0)

事件似乎需要有一个票据金额字段来验证最大票证是多少。然后它应该与ticket_class有一个外键关系。为了确保您不超过可用的票数,您可能需要使用类似clean方法的方法来验证在将票证与事件关联时不会超过。

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

我只是从高层看这个,所以也许我错过了什么。我也不清楚为什么你不能只把日期作为活动中的一个领域?