2015-09-01 37 views
0

我用瓶/ Jinja2的渲染一個簡單的模型來表。一切都運行得很好,但如果我嘗試分類和屬性,它可以是無,我得到一個的Jinja2 /瓶:當列表中包含排序錯誤無的

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

我實現__lt____gt__方法能夠我對象進行排序。

我的第一堂課是一個任務班。它具有Person類的外鍵。我想按人物類排序,但無是人的合法狀態。

模板片斷

{% 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

當比較的東西'None'你應該檢查身份,而不是平等。 '如果其他是None:'。 – dirn

+0

Thx爲小費 – tonka

回答

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

以下列表包含進行排序元組;當元組的第一個元素相等時,根據下一個元素打斷tie。

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