我想就此事请求一些帮助
我正在学习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条记录都有日期和时间
我做错了什么?对新手的任何建议?非常感谢。
答案 0 :(得分:19)
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()