【问题标题】:django: more models with the same fields and admin interfacedjango:具有相同字段和管理界面的更多模型
【发布时间】:2013-10-13 10:30:46
【问题描述】:

我有一个带有一些锻炼模型的卡片模型,每个锻炼都有完全相同的数据:锻炼名称、重复次数..等锻炼是 7 次,一周中的每一天。所以我用完全相同的数据编写了 7 个模型,这样在管理模型中我有 7 个锻炼,我可以为每个锻炼添加“+”我想要多少锻炼(使用内联)

有没有办法只编写一次锻炼模型,然后可以在管理界面中多次添加它? (每次我添加锻炼时,我都希望能够在同一个管理视图中添加锻炼名称、重复次数等)

class Card(models.Model):

    number = models.IntegerField()
    name = models.CharField(max_length=50)
    surname = models.CharField(max_length=50)  
    trainer = models.CharField(max_length=50, blank=True, null=True)  

    #Card status
    creation = models.DateField(auto_now_add=True)
    expiration = models.DateField(blank=True, null=True)

    #Member status
    subscription = models.DateField(blank=True, null=True)

    def __str__(self):
        return u'%s %s' % (self.surname, self.name)

    class Meta:
        unique_together = (("number"),)



class Exercise(models.Model):

    name = models.CharField(max_length=50)

    def __str__(self):
        return u'%s' % (self.name)


class Series(models.Model):

    number = models.IntegerField()

    def __str__(self):
        return u'%s' % (self.number)

    class Meta:
        verbose_name = 'Series'
        verbose_name_plural = 'Series'


class Repetitions(models.Model):

    number = models.IntegerField()

    def __str__(self):
        return u'%s' % (self.number)

    class Meta:
        verbose_name = 'Repetition'
        verbose_name_plural = 'Repetitions'


class Executions(models.Model):

    mode = models.CharField(max_length=50)

    def __str__(self):
        return u'%s' % (self.mode)

    class Meta:
        verbose_name = 'Execution'
        verbose_name_plural = 'Executions'


class Rest(models.Model):

    time = models.IntegerField()

    def __str__(self):
        return u'%s' % (self.time)

    class Meta:
        verbose_name = 'Rest'
        verbose_name_plural = 'Rest'


class Exercise1(models.Model):

    card = models.ForeignKey(Card)
    exercise = models.ForeignKey(Exercise)
    series = models.ForeignKey(Series)
    repetitions = models.ForeignKey(Repetitions)
    executions = models.ForeignKey(Executions)
    rest = models.ForeignKey(Rest)

    class Meta:
        verbose_name = 'Exercise'
        verbose_name_plural = 'Workout 1'

    def __str__(self):
        return u'%s' % (self.exercise) 

class Exercise2(models.Model):

    card = models.ForeignKey(Card)
    exercise = models.ForeignKey(Exercise)
    series = models.ForeignKey(Series)
    repetitions = models.ForeignKey(Repetitions)
    executions = models.ForeignKey(Executions)
    rest = models.ForeignKey(Rest)

    class Meta:
        verbose_name = 'Exercise'
        verbose_name_plural = 'Workout 2'

    def __str__(self):
        return u'%s' % (self.exercise) 


class Exercise3(models.Model):

    card = models.ForeignKey(Card)
    exercise = models.ForeignKey(Exercise)
    series = models.ForeignKey(Series)
    repetitions = models.ForeignKey(Repetitions)
    executions = models.ForeignKey(Executions)
    rest = models.ForeignKey(Rest)

    class Meta:
        verbose_name = 'Exercise'
        verbose_name_plural = 'Workout 3'

    def __str__(self):
        return u'%s' % (self.exercise) 


class Exercise4(models.Model):

    card = models.ForeignKey(Card)
    exercise = models.ForeignKey(Exercise)
    series = models.ForeignKey(Series)
    repetitions = models.ForeignKey(Repetitions)
    executions = models.ForeignKey(Executions)
    rest = models.ForeignKey(Rest)

    class Meta:
        verbose_name = 'Exercise'
        verbose_name_plural = 'Workout 4'

    def __str__(self):
        return u'%s' % (self.exercise) 


class Exercise5(models.Model):

    card = models.ForeignKey(Card)
    exercise = models.ForeignKey(Exercise)
    series = models.ForeignKey(Series)
    repetitions = models.ForeignKey(Repetitions)
    executions = models.ForeignKey(Executions)
    rest = models.ForeignKey(Rest)

    class Meta:
        verbose_name = 'Exercise'
        verbose_name_plural = 'Workout 5'

    def __str__(self):
        return u'%s' % (self.exercise) 

【问题讨论】:

  • 你能添加一些你的应用程序的代码吗? (模型等)
  • 我刚刚添加了我的 models.py 代码

标签: python django django-models django-admin


【解决方案1】:

感谢代码,现在更清楚了。 在我看来,您所有的数据库结构(通过 django ORM 模型创建)都是不正确的,基于 DRY 和构建数据库标准。

所以我将向您展示这个数据库应该如何寻找我。还有一件事,你应该使用__unicode__ 方法而不是__str__ (link)。

  1. class Card - 没关系
  2. class Exercise - 它只提供名称字段。为什么 ?不知道,不过我建议把这个类的名字改成ExerciseType,后面我会告诉你为什么:)
  3. Series, Repetitions, Executions, Rest - 类似于Exercise模型,每个模型只提供一个字段,每个字段的值不是很唯一。
  4. Exercise1-5 - 模型名称应为 Exercise,并且有额外的字段名为 exercise_type 或 type。

往下看:

class Card(models.Model):
    number = models.IntegerField()
    name = models.CharField(max_length=50)
    surname = models.CharField(max_length=50)  
    trainer = models.CharField(max_length=50, blank=True, null=True)  
    #Card status
    creation = models.DateField(auto_now_add=True)
    expiration = models.DateField(blank=True, null=True)
    #Member status
    subscription = models.DateField(blank=True, null=True)

    def __unicode__(self):
        return u'%s %s' % (self.surname, self.name)

    class Meta:
        unique_together = (("number"),)

class ExerciseType(models.Model):

    name = models.CharField(max_length=50)

    def __unicode__(self):
        return u'%s' % (self.name)

class Exercise(models.Model):
    type = models.ForeignKey(ExerciseType)
    card = models.ForeignKey(Card)
    #instead of FK, better solutions is to use normal value-field 
    series = models.IntegerField()
    repetitions = models.IntegerField()
    executions = models.CharField()
    rest = models.IntegerField()
    #here comes methods like __unicode__ etc ....

因此,我们有 3 个模型(表)而不是 11 个,更简单的 sql 查询(没有 6 个 SQL 连接。功能是相同的(我希望 :))。如果您有任何问题,请问我,我会尽力提供帮助。

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-16
    • 1970-01-01
    • 2011-11-25
    • 1970-01-01
    相关资源
    最近更新 更多