【问题标题】:Jinja2/Flask: sort-error when list contains None'sJinja2/Flask:当列表包含无时排序错误
【发布时间】:2015-09-01 11:51:55
【问题描述】:

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

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

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

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

模板sn-p

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

models.py sn-p:

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))

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

【问题讨论】:

  • 在将事物与None 进行比较时,您应该检查身份,而不是平等。 if other is None:.

标签: python-3.x flask jinja2 nonetype


【解决方案1】:

这里的问题是您的列表中有多个 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 代码中,您可以提取元组(决胜局是 Task 属性):

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

【讨论】:

    猜你喜欢
    • 2013-01-24
    • 1970-01-01
    • 1970-01-01
    • 2021-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-07
    相关资源
    最近更新 更多