我使用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))
有人知道如何解决这个问题吗?
答案 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))