我正在一个销售活动门票的网站上工作。我有以下设计:
(简化发布)模型:
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)
我希望自己说清楚,英语不是我的第一语言。随意提出任何疑问
答案 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
我只是从高层看这个,所以也许我错过了什么。我也不清楚为什么你不能只把日期作为活动中的一个领域?