为啥 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 数据类型在模型方法和视图中不同?的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET MVC 新手:为啥在创建强类型视图时我的模型不可用?

ios 为啥model传值之后视图会消失

如何在 Django DateField 中仅保留日期部分

如何从 DateField 对象中提取日、月、年?

Django数据模型--字段整理

在 django 模型中加密 DateField?