为啥 DateField 数据类型在模型方法和视图中不同?
Posted
技术标签:
【中文标题】为啥 DateField 数据类型在模型方法和视图中不同?【英文标题】:Why DateField data type is different in model method and view?为什么 DateField 数据类型在模型方法和视图中不同? 【发布时间】:2015-05-06 21:47:18 【问题描述】:在 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'>
。
【问题讨论】:
您在哪里以及如何调用is_of_age
方法?
【参考方案1】:
模型字段在分配值时不会自动转换为正确的 python 类型 - 仅在保存时转换为正确的数据库类型。 Django 不保证 birth_date
的类型,除了一些使用描述符的特殊字段(想想ForeignKey
等)。
从数据库中检索的数据以一致的方式转换为 Python 类型。老实说,我不知道它是否总是相同的类型,但对于相同的数据,它将是一致的。这是您将获得的唯一保证。
BooleanField
会更加明显。考虑以下简单模型:
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
【讨论】:
以上是关于为啥 DateField 数据类型在模型方法和视图中不同?的主要内容,如果未能解决你的问题,请参考以下文章