在Django中,我有一些模型,比如说:
class Learner(models.Model):
birth_date = models.DateField(null=True, blank=True)
def is_of_age(self):
logging.debug(type(self.birth_date))
.....
和视图,比方说:
def overview(request):
learner = Learner.objects.get(.....)
logging.debug(type(learner.birth_date))
.....
为什么birth_date
的类型不同?在模型的方法中,它是<class 'dict'>
,而在视图中则是<class 'datetime.date'>
。
模型字段在赋值时不会自动转换为正确的python类型,仅在保存时转换为正确数据库类型。Django对birth_date
的类型没有任何保证,除了一些使用描述符的特殊字段(比如ForeignKey
等)
从数据库检索的数据以一致的方式转换为Python类型。老实说,我不知道它是否总是相同的类型,但对于相同的数据,它将是一致的。这是你能得到的唯一保证。
这在CCD_ 6的情况下变得更加明显。考虑以下简单模型:
class Learner(models.Model):
is_of_age = models.BooleanField(blank=True)
以下展示了这种行为:
>>> learner = Learner(is_of_age='yes he is')
>>> learner.save()
>>> learner.is_of_age
'yes he is'
>>> Learner.objects.get(pk=learner.pk).is_of_age
True