我想为小型健身房开发一款django管理应用程序。
我们有一个成员列表
每个成员可以有一张或多张卡
每张卡可以有一次或多次锻炼
每次锻炼都可以进行一次或多次锻炼
每个练习都有以下字段:
运动名称(可从运动名称列表中选择), 系列号(可从系列列表中选择), 重复次数(可以从重复列表中选择), 执行模式(可以从执行列表中选择), 休息时间(可以从执行列表中选择)。
这是我对models.py:
的可能实现from django.db import models
from django.contrib.auth.models import User
# Create your models here.
class Member(models.Model):
#Member data
name = models.CharField(max_length=50)
surname = models.CharField(max_length=50)
#Contact
email = models.EmailField(blank=True, null=True)
phone = models.CharField(max_length=50, blank=True, null=True)
#Body
birthday = models.DateField(blank=True, null=True)
height = models.IntegerField(blank=True, null=True)
weigth = models.IntegerField(blank=True, null=True)
#Trainer notes
trainer = models.ForeignKey(User, limit_choices_to={'is_staff': True, 'is_superuser': False}, blank=True, null=True)
note = models.CharField(max_length=160, blank=True, null=True)
#Registration status
registration = models.DateField(auto_now_add=True)
expiration = models.DateField(blank=True, null=True)
card = models.OneToOneField('Card')
def __str__(self):
return u'%s %s' % (self.surname, self.name)
class Card(models.Model):
number = models.IntegerField()
#Card status
card_creation = models.DateField(auto_now_add=True)
card_expiration = models.DateField(blank=True, null=True)
workout = models.ForeignKey('Workout')
def __str__(self):
return u'%s' % (self.number)
class Workout(models.Model):
number = models.IntegerField()
exercise = models.ForeignKey('Exercise')
def __str__(self):
return u'%s' % (self.number)
class Exercise(models.Model):
name = models.ForeignKey('Name')
series = models.ForeignKey('Serie')
repetitions = models.ForeignKey('Repetition')
executions = models.ForeignKey('Execution', blank=True, null=True)
rest = models.ForeignKey('Rest')
def __str__(self):
return u'%s' % (self.name)
class Name(models.Model):
name = models.CharField(max_length=50)
def __str__(self):
return u'%s' % (self.name)
class Serie(models.Model):
serie = models.CharField(max_length=50)
def __str__(self):
return u'%s' % (self.serie)
class Repetition(models.Model):
repetition = models.IntegerField()
def __str__(self):
return u'%s' % (self.repetition)
class Execution(models.Model):
execution = models.CharField(max_length=50)
def __str__(self):
return u'%s' % (self.execution)
class Rest(models.Model):
rest = models.IntegerField()
def __str__(self):
return u'%s' % (self.rest)
我不确定这是否如所描述的那样有效。你能否建议一个可能的实施? 最后我想只有一个包含所有数据的视图:成员,卡片,锻炼...所以工作人员用户可以修改用户和链接的锻炼卡)是否可以使用admin.py或我是否需要自定义管理员?
答案 0 :(得分:2)
看起来相当不错,就像Samidh T在评论中说的那样,你应该用sqlite打开一个开发服务器并玩它。看看哪些不起作用。这是你能做的最好的事情。
然而,既然你问过,这里有几点要记住:
"each member could have 1 or more card"
- 那你为什么在Memeber的卡片领域是OneToOne?为将其链接到成员的Card执行ForeignKey(基本上是ManyToOne)字段会不会更有意义吗?
"each card could have 1 or more workout"
- 如果你有从卡到锻炼的外国钥匙,那么你实际上正在做与你所描述的相反的事情,你正在为一个人(锻炼)做多人(卡)。但也许这就是你想要的?或者你真的希望它成为ManyToManyField?因为每个锻炼可能有不同的卡,反之亦然。我真的不知道这里最合适的是什么,但这是你可能想要考虑的事情。
"each workout could have 1 or more exercise"
与之前的观点相同。
我发现锻炼中的每个区域都是ForeingKey。现在再次 - 这不是一个糟糕的选择或想法,但你应该考虑这需要什么,并考虑用ManyToMany替换它,或者,如果其中一个字段是静态列表(即你有一个有限的可用名称列表)您知道将来不会发生太大变化)然后您可以使用带有选项choices=
的CharField。
我无法准确地告诉你“这很糟糕”,“这很好”,这是一个非常项目主观的事情,但我希望我的一些提示能够以某种方式帮助你。最后,这一切都归结为您的需求。如果您发现自己感到困惑,我建议您仔细阅读SQL中的表关系以及它们的工作原理。
Django非常适合实现复杂的关系,但是之前使用它而不需要学习一点SQL可能会让人感到困惑,因为你只看到最终的结果,而且几乎看不到表本身。