Jinja2 / Flask:列表包含None时的排序错误

时间:2015-09-01 11:51:56

标签: python-3.x flask jinja2 nonetype

我使用Flask / Jinja2将简单模型渲染到表格中。一切正常,但如果我尝试排序和属性可以是无,我得到一个

TypeError: unorderable types: NoneType() < NoneType()

我实施了__lt____gt__方法,以便能够对对象进行排序。

我的第一堂课是一堂课。它有一个Person-class的外键。我想按人类排序,但没有人是合法的人。

模板代码段

 {% for t in tasks | sort(attribute=sort_on) %}

models.py片段:

class Person(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(300),nullable=False)
    username = db.Column(db.String(300),nullable=False,unique=True)
    tasks = db.relationship('Task', backref='resource', lazy='dynamic')

    def __lt__(self,other):
        if other == None:
            return True
        return self.name.__lt__(other.name)

    def __gt__(self,other):
        if other == None:
            return False
        return self.name.__gt__(other.name)


class Task(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(300),nullable=False)
    text = db.Column(db.Text)
    prio = db.Column(db.Integer)
    person_id = db.Column(db.Integer, db.ForeignKey('person.id'))
    project_id = db.Column(db.Integer, db.ForeignKey('project.id'),nullable=False)
    planned_days = db.Column(db.Integer)
    done = db.Column(db.Integer)
    state_id = db.Column(db.Integer, db.ForeignKey('state.id'),nullable=False)
    issue = db.Column(db.String(100))

有人知道如何解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

这里的问题是你的列表中有多个 None值可以排序,None个对象本身不可排序:

>>> sorted([None, None])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unorderable types: NoneType() < NoneType()

然后诀窍是提供决胜局:

>>> sorted([(None, 1), (None, 0)])
[(None, 0), (None, 1)]

此处列表包含正在排序的元组;当元组的第一个元素相等时,根据下一个元素打破平局。

在Jinja2中,您无法直接执行此操作,因为内置的sort filter不允许您按任意键功能进行排序。

理想情况下,您应该在SQL代码中执行此操作,而不是在模板或Python代码中执行此操作:

if sort_on == 'person':
    query = Task.query.join(Task.person_id).order_by(Person.name)

但是在Python代码中你可以提取元组(使用tiebreaker作为Task属性):

sorted(tasks, key=lambda t: (t.person and t.person.name, task.name))