Django:在模型中创建模型实例

时间:2013-02-03 12:14:31

标签: django django-models

我有另一个可能非常基本的Django问题。我正在为我的课程编写一个数据库应用程序,我希望能够在应用程序中设置当前年份。这背后的想法是,当所有标记等完成时,我可以手动切换到下一学年。那么切换当前年份的功能也应该做其他事情 - 让学生参加新的默认课程等。

所以我创建了一个名为MetaData的模型:

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)

不幸的是,当我第一次运行syncdb时,我收到错误“No such table:database_metadata” - 我猜是因为syncdb在测试代码时没有创建表。

对此有更好的解决方案吗?

3 个答案:

答案 0 :(得分: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作简单日期会更简单。

答案 1 :(得分:0)

要么将常量放在你的代码中(如果你可以硬编码计算学年的逻辑。或者总是记得手动更改它,这听起来不错,因为你已经硬编码ACADEMIC_YEARS) ,或在数据库中,如danodonovan所暗示的那样。或者直接模拟学年,而不是在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并将其显示为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)

答案 2 :(得分: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"