Dictsort无法正常使用从model属性返回的datetimes

时间:2013-08-21 21:04:20

标签: django django-models django-templates

我有一个具有日期时间的模型:

class Meeting(models.Model):
    section = models.ForeignKey(Section)
    start_time = models.DateTimeField(verbose_name='meeting start time')

和访问日期时间的异物(获取最早的start_time):

class Section(models.Model):
    def calculate_start_date(self):
        try:
            start = Meeting.objects.filter(section__id=self.id).order_by('start_time')[0].start_time
            return start                          
        except IndexError:
            start = datetime.datetime.utcnow()
            return start
    course = models.ForeignKey(Course)
    first_start_date = property(calculate_start_date)

class Course(models.Model):
    title = models.CharField(max_length=255)

现在,当我在我的模板中使用它时:

{% for course in course_list %}
    {{ course.title }}
    {% for section in course.section_set.all %}
        {{ section.first_start_date }}
    {% endfor %}
{% endfor %}

它会打印出所有部分的日期。如果某个部分没有与之相关联的会议,则会打印出当前日期。

当我尝试引入dictsort来按时排序会议时,我的问题就出现了:

{% for course in course_list %}
    {{ course.title }}
    {% for section in course.section_set.all|dictsort:"first_start_date" %}
        {{ section.first_start_date }}
    {% endfor %}
{% endfor %}

这适用于任何课程,其所有部分至少有一次会议,但未能正确显示任何没有会议链接部分的课程。

我在这里很困惑,因为第一个模板似乎表明当一个部分没有与之相关联的会议时提供了当前时间的日期时间,但是在第二个模板中,它表现得像这样不是这样的。

为什么dictsort在这里失败?

2 个答案:

答案 0 :(得分:1)

终于弄清楚发生了什么。

我已经让Django设置为时区,所以当有一个会议附加到该部分时,它给了我数据库的时区感知日期,但是当没有这样的会议时,我提供的日期为:

start = datetime.datetime.utcnow()

这是时区不知道。

Dictsort在比较时区感知和时区未知日期时无声地失败。

现在我已经切换到提供时区感知日期,它正在运行:

start = datetime.datetime.utcnow().replace(tzinfo=utc)

答案 1 :(得分:0)

看起来dictsort的实现要求course.section_set.all是可迭代的。

但是,如果course没有附加任何部分,course.section_set.all会返回None而不是空迭代器,导致course.section_set.all|dictsort失败。

您需要测试course.section_set.count是积极的,并有条件地过滤course.section_set.all