遵循Django官方文档的说明时出现问题

时间:2014-12-02 15:43:09

标签: python django django-models

我正在关注Django官方教程编写您的第一个Django应用程序,第1部分。最后,我必须给出以下命令:

q.was_published_recently()

输出应为:

True

相反,我有:

False

这是我的models.py文件:

import datetime

from django.db import models
from django.utils import timezone

# Create your models here.
class Question(models.Model):
    question_text = models.CharField(max_length=200)
    pub_date = models.DateTimeField('date published')

    def __unicode__(self):
        return u'%s' % (self.question_text)

    def was_published_recently(self):
        return self.pub_date >= timezone.now()-datetime.timedelta(days=1)

    class Choice(models.Model):
        question = models.ForeignKey(Question)
        choice_text = models.CharField(max_length=200)
        votes = models.IntegerField(default=0)

    def __unicode__(self):
        return u'%s %s' % (self.first_name, self.last_name)

我猜可能是我在 timedelta 功能时遇到问题。我不确定。

N.B。:文件的确切步骤是:

>>> from polls.models import Question, Choice
>>> Question.objects.all()
[<Question: What's up?>]
>>> Question.objects.filter(id=1)
[<Question: What's up?>]
>>> Question.objects.filter(question_text__startswith='What')
[<Question: What's up?>]


>>> from django.utils import timezone
>>> current_year = timezone.now().year
>>> Question.objects.get(pub_date__year=current_year)
<Question: What's up?>

>>> Question.objects.get(id=2)
Traceback (most recent call last):
     ...
DoesNotExist: Question matching query does not exist.

>>> Question.objects.get(pk=1)
<Question: What's up?>

>>> q = Question.objects.get(pk=1)

>>> q.was_published_recently()
True

2 个答案:

答案 0 :(得分:1)

根据方法名称,我会说False在这种情况下是正确的返回值。如果问题不是一天,则该方法应返回True。在您的情况下,pub_date是一个超过一天的日期,因此它不是“最近发布的”,因此该方法返回False。如果使用q.pub_date = timezone.now()将日期更改为现在,然后使用q.save()保存,则q.was_published_recently()应该在一天内返回True。

答案 1 :(得分:0)

最后,我发现了这个问题。它是在 was_published_recently()方法的定义中。它应该是&lt; = 而不是&gt; =

这是重新定义的方法:

def was_published_recently(self):
    return self.pub_date <= timezone.now()-datetime.timedelta(days=1)

以前,该方法测试的是pub_date是否大于或等于昨天的错误。

现在,它正在测试pub_date是否小于或等于昨天,这是正确的。