2013-09-29 37 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