0

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

class Meeting(models.Model):
    section = models.ForeignKey(Section)
    start_time = models.DateTimeField(verbose_name='meeting 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 在这里失败?

4

2 回答 2

1

终于搞清楚是怎么回事了。

我已将 Django 设置为时区感知,因此当该部分附有会议时,它会从数据库中为我提供时区感知日期,但是当没有此类会议时,我提供的日期为:

start = datetime.datetime.utcnow()

这是时区不知道。

在比较时区感知和时区不感知日期时,Dictsort 静默失败。

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

start = datetime.datetime.utcnow().replace(tzinfo=utc)
于 2013-08-22T13:30:03.760 回答
0

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

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

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

于 2013-08-21T22:34:03.983 回答