【发布时间】:2016-06-24 08:12:33
【问题描述】:
我遇到了设计问题。抱歉,如果这没有发布在正确的类别中,我真的想知道在哪里提出这个问题:-/
我为一个朋友(从现在起称为“管理员”)做了这个小型 Zumba 课程应用程序。这是一个使用 django 和 sqlite 制作的本地 Web 应用程序来存储数据。起初,只提供 2 类类别:Regular 和 Advanced,因此对这部分进行了硬编码以简化逻辑。
现在,我正在努力使这种动态化,并允许创建任意数量的类类型,而无需每次都修改代码和数据库架构。 例如,可能有: 14 岁及以下的“青少年” “常规的” “高级”
然后管理员可以为这些相应的班级创建“打孔卡”。 例子: 普通 20 :包括 20 次任何普通班级的通行证。 黄金 30:任何黄金级别的 30 通行证。 等等 在应用程序逻辑中,普通通行证持有者无法使用它来访问 Gold 类,因为该类的价格不同。所以他必须通过金卡才能进入这些课程。
现在,这就是我卡住的地方。如何将此信息添加到会员帐户并能够使用它?我的问题是每次使用打孔卡时,留下的通行证数量必须减少一。并且当会员购买新卡时,它必须允许将新通行证添加到剩余金额中。 它看起来很容易,只需在成员模型中添加一个字段,保存每个类类型的剩余通行数。(这就是我以前所做的)但是,因为我现在想让管理员创建新类型的类,我'永远不会知道需要多少这些字段。(因为模型需要每个类类型一个字段)
然后我想使用一个包含 dict 的字段,[classtype_id, #_passes] 类类型 id 会告诉我它是黄金类、普通类还是任何其他类,后面的数字是剩余的通行证。但是我搜索了一下,似乎您无法将字典存储在数据库中(很遗憾)。
我应该将此信息存储到 XML 文件中吗?将数据库查询与文件操作结合起来会大大减慢速度吗?
还有其他需要探索的解决方案吗?
如果有帮助,这里是模型:
class ClassType(models.Model):
name = models.CharField(max_length=64, blank=False, null=False)
default = models.BooleanField(default=False)
class MyUsers(models.Model):
username = models.CharField(max_length=64, unique=True, db_index=True)
firstname = models.CharField(max_length=64)
lastname = models.CharField(max_length=64)
fullname = models.CharField(max_length=128, db_index=True, editable=False)
email = models.CharField(max_length=64, db_index=True)
telephone = models.CharField(max_length=64, null=True, blank=True)
member_since = models.DateTimeField(editable=False)
last_seen = models.DateTimeField(editable=False, null=True)
notes = models.TextField(blank=True, null=True)
def save(self):
if not self.id:
self.member_since = datetime.date.today()
self.fullname = self.firstname + " " + self.lastname
super(MyUsers, self).save()
class Classes(models.Model):
name = models.CharField('Class Name', max_length=64, blank=False, null=False)
date = models.DateTimeField('Start Date & Time', blank=False, null=False)
classtype = models.ForeignKey(ClassType, blank=False, null=False, default=1)
status = models.IntegerField('Status', default=1) # 1 = open, 0 = closed
myusers = models.ManyToManyField(MyUsers, blank=True)
class Punchcard(models.Model):
classes = models.IntegerField('Number of classes', blank=False, null=False)
price = models.DecimalField(decimal_places=2, max_digits=6, blank=False, null=False)
label = models.CharField('Name of the punchcard', max_length=64, db_index=True, blank=False, null=False)
classtype = models.ForeignKey(ClassType, blank=False, null=False)
myusers = models.ManyToManyField(MyUsers, blank=True)
def __str__(self):
return self.label
class Meta:
verbose_name = 'Punchcard'
verbose_name_plural = 'Punchcards'
【问题讨论】:
标签: django python-3.x database-design django-models