为什么DateField数据类型在模型方法和视图中不同



在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