0

我想为一个小型健身房开发一个 django 管理应用程序。

我们有一份成员名单

每个会员可以拥有一张或多张卡

每张卡可以进行 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 或者我需要自定义行政?

4

1 回答 1

2

这看起来很不错,就像 Samidh T 在评论中所说,您应该使用 sqlite 打开一个开发服务器并使用它。看看什么有效,什么无效。这是你能做的最好的事情。

但是,既然您问了,请记住以下几点:

  • "each member could have 1 or more card"- 那你为什么在会员卡领域是OneToOne?为将其链接到成员的 Card 做一个 ForeignKey(本质上是 ManyToOne)字段不是更有意义吗?

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

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

  • 我看到您练习中的每个字段都是 ForeingKey。再说一遍 - 这不是一个糟糕的选择或想法,但您应该考虑这意味着什么,并考虑用 ManyToMany 替换它,或者,如果其中一个字段是静态列表(即您有一个有限的可用名称列表您知道将来不会发生太大变化),那么您可以使用带有选项的 CharField choices=

我不能准确地告诉你“这很糟糕”,“这很好”,这是一个非常项目主观的事情,但我希望我的一些提示在某种程度上对你有所帮助。最后,这一切都归结为您需要什么。如果您发现自己感到困惑,我建议您阅读一些关于 SQL 中的表关系以及它们如何工作的内容。

Django 非常适合实现复杂的关系,但是在没有学习一点 SQL 的情况下使用它有时会让人感到困惑,因为您只看到最终结果而几乎不看表本身。

于 2013-09-29T19:58:48.797 回答