2013-09-29 33 views
0

我想开发一个小型健身房的django管理应用程序。django健身房的数据库结构会员锻炼管理

我们有会员

的列表中的每个成员都可以有1个或多个卡

每张卡可以有1个或更多的锻炼

每次锻炼可以有1个或多个运动

每个练习都有以下字段:

练习名称(可以从练习名称列表中选择), 系列号(可从系列清单中选择), 重复次数(可从重复清单中选择), 执行模式(可从执行清单中选择), 休息时间(可选择执行清单)。

这是我的不可能性的实现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或我需要一个自定义管理?

+1

你试过了你的实现吗? –

+0

是的,但林不知道和管理界面不可用,因为它不可能嵌套内联 – avafab

回答

2

看起来相当不错,就像Samidh T在评论中说的那样,你应该用sqlite打开一个dev服务器并且玩弄它。看看有什么工作不是。这是你能做的最好的事情。

但是,既然你问,这里有一对夫妇指出牢记:

  • "each member could have 1 or more card" - 那么为什么在Memeber一个OneToOne你卡领域?对于将卡链接到成员卡的ForeignKey(实质上是一个ManyToOne)字段是否更有意义?

  • "each card could have 1 or more workout" - 如果你的卡上有一个外键用于锻炼,那么你实际上做的和你所描述的相反,你正在为One(锻炼)做许多(卡)。但也许这是你想要的?或者,也许你真的希望它是一个ManyToManyField?因为每次锻炼可能有不同的牌,反之亦然。我真的不知道这里最适合什么,但这是你可能想要考虑的问题。

  • "each workout could have 1 or more exercise"与以前相同。

  • 我发现练习中的每个领域都是ForeingKey。现在又一次 - 这不是一个错误的选择或想法,但是您应该考虑这会带来什么,并且考虑用ManyToMany替换它,或者如果其中一个字段是静态列表(即,您有可用名称的有限列表你知道在将来不会改变),那么你可以使用CharField和choices=选项。

我不能确切地告诉你:“这是不好的”,“这是件好事”,这是一个非常项目,主观的东西,但我希望我的一些建议以某种方式帮助你。最后,这一切都归结为你需要的东西。如果您发现自己感到困惑,我建议您阅读一些关于SQL中的表关系以及它们的工作方式。

Django对于实现复杂的关系非常棒,但是在不学习一点SQL的情况下使用它,有时候会因为只看到最终结果而几乎没有查看表本身而导致混淆。

+0

我玩这个我看到我犯了一些错误,你注意到了。我纠正了它们,现在它的工作方式与我想象的非常相似,但不幸的是,amin界面没有我想要的那样强大。我想从一个视图中完全控制每张牌,但是所有这些关系我只能修改一张桌子在时间......我需要编写一个自定义的后端? – avafab

+0

尝试阅读有关自定义管理网站的文档,处理表格关系(内联等)有很多功能。但请记住,因为它是非常通用的,所以它非常有限。然而,单独模仿也是非常容易的,所以是的,如果你想要具体构建自己的视图(并且不使用通用视图!!我的意思是,除非你没有它们,否则它们很舒服。它们是初学者的sandtrap ) – yuvi

+0

您可以搜索允许多重内联的应用程序 - 有一些应用程序,但我没有尝试过,因此我不想指向特定的应用程序。 – OBu