2013-02-03 53 views
0

我還有另一個可能很基本的Django問題。我正在爲我的類編寫一個數據庫應用程序,我希望能夠從應用程序中設置當前年份。這背後的想法是,我可以手動切換到下一個學年,當所有的標記等完成。切換本年度的功能,然後應該做其他的事情,以及 - 把學生在新的默認課程等Django:在模型內創建模型實例

所以我創建了一個模型稱爲元數據:

class MetaData(models.Model): 
    data_id = models.IntegerField(default = 1, unique = True) 
    current_year = models.IntegerField(choices=ACADEMIC_YEARS) 

這將是巨大的如果我可以在其他模型中訪問current_year,例如當我想要輸入新課程/學生時將其設置爲默認值。我嘗試這樣做:

class Course(models.Model): 
    try: 
     meta = MetaData.objects.get(data_id=1) 
     current_year = meta.current_year 
    except MetaData.DoesNotExist: 
     current_year = 2010 
    year = models.IntegerField(choices=ACADEMIC_YEARS, default=current_year) 

不幸的是,我得到的錯誤「沒有這樣的表:database_metadata」當我第一次運行執行syncdb - 我猜,因爲執行syncdb沒有創建表時,它測試的代碼。

有沒有更好的解決方案呢?

回答

0

要麼將​​常量放入代碼中(如果您可以硬編碼計算學年的邏輯,或者始終記住手動更改它,這聽起來不錯,因爲您已經硬編碼ACADEMIC_YEARS),或者以數據庫的形式danodonovan建議。或學年直接建模的w/o在MetaData

from django.core.exceptions import ValidationError 

class AcademicYear(models.Model): 
    start = models.DateField() # or simply year 
    end = models.DateField() 
    is_current = models.BooleanField() 

    class Meta: 
     ordering = ('-is_current', 'start') 

    def clean(self): # only allow at most one current year 
     if self.is_current and \ 
      self.__class__.objects.exclude(pk=self.pk).filter(is_current=True).exists(): 
      raise ValidationError('Found another `current` academic year.' 

    def __unicode__(self): 
     return 'blahblah' 

# then in Course 
class Course(models.Model): 
    academic_year = models.ForeignKey(AcademicYear) 

存儲恆定的。因此在管理,你可以很容易地加強AcademicYear S和顯示它們作爲Course的academic_year領域的選擇。

如果你仍然想使用MetaData,只是改變current_year是一個函數:

def get_current_year(): 
    try: 
     return MetaData.objects.get(data_id=1).current_year 
    except MetaData.DoesNotExist: 
     return 2010 

class Course(models.Model): 
    year = models.IntegerField(choices=ACADEMIC_YEARS, default=get_current_year) 
0

這聽起來像您需要使用ForeignKey字段來鏈接您的模型。

class MetaData(models.Model): 
    current_year = models.IntegerField(choices=ACADEMIC_YEARS) 

class Course(models.Model): 
    year = models.ForeignKey(MetaData, default=this_year) 

    def this_year(self): 
     return MetaData.objects.get(current_year=datetime.now().year) 

要設置默認的一年,我已經添加了一個this_year功能的MetaData模型。在設置默認年份時,Course型號年份屬性將調用此設置。

話雖如此,如果您在簡單的日期使用DateField會更簡單。

+0

的ForeignKey的無助 - 我想在這裏使用的基本上是一個常量,需要每年更換一次。 我的計劃是讓我點擊管理菜單中的一個按鈕,這個按鈕可以改變2012年到2013年的所有年份,並將所有學生放入新年的默認課程中,等等。如果我想進入一門新課程,那麼使用current_year作爲默認值會很有用。 – Tobi

+1

在'default ='後面似乎'this_year'需要是可調用的,例如classmethod。 – okm

+0

糟糕 - 感謝,'def this_year'是錯誤的類 – danodonovan

0
class Boat_Owner(models.Model): 
     username = models.CharField(max_length=200) 
     password = models.CharField(max_length=200) 
     name = models.CharField(max_length=200,unique=True, 
     verbose_name="Boat Owner Name") 
     address = models.CharField(max_length=200) 
     phone = models.CharField(max_length=200) 
     email = models.EmailField('email address', 
     unique=True, db_index=True) 
     avatar = models.ImageField('profile picture',  
     upload_to='static/media/images/avatars/', 
     null=True, blank=True) 
     def set_avatar(self): 
      self.has_picture = True 
     def __str__(self): 
      return u'%s %s %s %s %s %s' % (self.id,self.name,self.username,self.password,self.address,self.email) 
    class Meta: 
      verbose_name = "Boat Owner" 
      verbose_name_plural = "Boat Owner" 
相關問題