从Django DateTimeField获取日期

时间:2016-02-09 19:21:06

标签: python django

我想就此事请求一些帮助

我正在学习django并尝试一些代码,但是我试图仅从模型的DateTimeField获取日期时碰到了一堵砖墙

这是我正在处理的代码:

class APPLICANT_DATA(models.Model):
    SCHEDULED_AT = models.DateTimeField(null=True, blank=True)


def somefunction():
    app_data = APPLICANT_DATA.objects.all()
    for item in app_data:
        the_date = str(item.SCHEDULED_AT.strftime("%B-%d-%Y")) + ", " + the _date

我得到('NoneType' object has no attribute 'strftime')即使我的模型包含3条记录都有日期和时间

我做错了什么?对新手的任何建议?非常感谢。

3 个答案:

答案 0 :(得分:19)

DateTimeField成为Python中的datetime.datetime对象

如果以后需要date对象进行操作,可以使用datetime.datetime.date()直接从datetime.date提取DateTimeField()对象,如下所示:

class ApplicantData(models.Model):
    scheduled_at = models.DateTimeField(null=True, blank=True)

date = application_data.scheduled_at.date()

这是有效的,因为Django会将DateTimeField翻译成Python类型datetime.datetime,我们称之为date()

按照您的意愿格式化datetime.date

然后,您可以使用datetime.date.strftime()获得一个datetime.date对象,您可以按照自己的意愿进行格式化。

如果您不需要date个对象,也可以在strftime对象上使用datetime.datetime,没有任何问题。除了你的对象中有一个无字段。

处理NULL / None字段

如果要在scheduled_at中允许NULL值,可以执行以下操作:

if application_data.scheduled_at is not None:
      date = application_data.scheduled_at.date()

答案 1 :(得分:1)

SCHEDULED_AT设置为null=True,因此有时item.SCHEDULED_AT没有值,因此它是None。如果您在.strftime上执行None,则会出现错误。 null=True表示django模型允许该字段具有NULL值。

顺便说一下,对模型和字段名称使用全部大写是非常不好的做法,模型名称应该是驼峰式的,而字段应该是带有下划线的小写。您的模型名称应为ApplicantData,字段名称应为scheduled_at

答案 2 :(得分:0)

虽然在给定的示例中,问题很可能是由于对象真正是None,如其他答案中所述,请注意,如果您忘记清理,可能会在测试代码中遇到这种情况通过调用数据,例如您的DateTimeField上的full_clean()如下:

test_obj = YourModel(
    date=datetime.datetime(2016,2,26,tzfinfo=GM1),
    ...
)
test_obj.full_clean() # <-- don't forget this or you'll get a NoneType object
test_obj.save()