0

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

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

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

如果我可以在其他模型中访问 c​​urrent_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 时,我得到了错误“没有这样的表:database_metadata”——我猜是因为 syncdb 在测试代码时没有创建表。

有没有更好的解决方案?

4

3 回答 3

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在模型中添加了一个函数MetaDataCourse模型年份属性将在设置默认年份时调用它。

DateField话虽如此,如果您将 a用于简单的日期,它会简单得多。

于 2013-02-03T12:19:24.323 回答
0

要么把常数放在你的代码中(如果你可以硬编码计算学年的逻辑。或者总是记得手动更改它,这听起来不错,因为你已经硬编码了ACADEMIC_YEARS),或者像 danodonovan 建议的那样在 DB 中。或者直接模拟学年,不存储常数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)

因此,在 Admin 中,您可以轻松升级AcademicYears 并将它们显示为Course.

如果您仍想使用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)
于 2013-02-03T16:11:30.913 回答
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"
于 2015-06-09T08:48:46.687 回答