Django:日期字段保存到模型但未检索

时间:2016-07-03 16:57:43

标签: django

Django 1.9 / Python 2.7

鉴于此模型:

class CoursePurchase(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL)
    course = models.ForeignKey(Course)
    date_purchased = models.DateField(default=date.today())

我希望date_purchased存储我输入Django管理员的日期,根据我的数据库浏览器,它确实存在:

Alt text

但是,检索视图中的对象具有今天的日期而不是存储的日期:

Alt text

(注意__unicode__的date_purchased字段返回今天的日期而不是存储的日期。

以下是我用来检索实例的代码:

cp = CoursePurchase(course=page.course, user=request.user)

其中courseuser返回预期值。

我错过了什么?这似乎相当简单,但我无法理解这一点。

2 个答案:

答案 0 :(得分:3)

要在保存时设置当前日期,django会为DateField类型提供特殊参数:

Django documentation

  

class DateField(auto_now=False, auto_now_add=False, **options)

     

日期,由datetime.date实例以Python表示。有一些额外的可选参数:

     

<强> DateField.auto_now

     

每次保存对象时自动将字段设置为现在。对“最后修改”的时间戳有用。请注意,始终使用当前日期;它不仅仅是您可以覆盖的默认值。

     

该字段仅在调用Model.save()时自动更新。使用其他方式(如QuerySet.update())更新其他字段时,不会更新该字段,但您可以在更新中为该字段指定自定义值。

     

<强> DateField.auto_now_add

     

首次创建对象时自动将字段设置为现在。用于创建时间戳。请注意,始终使用当前日期;它不仅仅是您可以覆盖的默认值。因此,即使您在创建对象时为此字段设置了值,也会将其忽略。如果您希望能够修改此字段,请设置以下内容而不是auto_now_add = True:

     

对于DateField:default = date.today - 来自datetime.date.today()   对于DateTimeField:default = timezone.now - 来自django.utils.timezone.now()   此字段的默认表单窗口小部件是TextInput。管理员添加了一个JavaScript日历,以及“今天”的快捷方式。包含一个额外的invalid_date错误消息密钥。

     

选项auto_now_add,auto_now和default是互斥的。这些选项的任何组合都会导致错误。

但这不是你看到的问题的原因。当你这样做时:

cp = CoursePurchase(course=page.course, user=request.user)

您不是从数据库中检索任何内容,而是创建新实例(仅在内存中,尚未保存在任何位置)。要检索实例,您需要query the database properly

cp = CoursePurchase.objects.get(course=page.course, user=request.user)

答案 1 :(得分:0)

您可以尝试这样。

cp = CoursePurchase.objects.get(course=page.course, user=request.user)