我有另一个可能非常基本的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在测试代码时没有创建表。
对此有更好的解决方案吗?
答案 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"