如何在交互式会话中(在iPython中)向现有类添加模型方法?

时间:2009-07-17 15:02:23

标签: python django ipython

我有一个基本模型:

class Person(models.Model):
    first_name = models.CharField(max_length=50)
    last_name = models.CharField(max_length=50)
    state = USStateField() 

我用以下内容启动了一个iPython会话:

$ python manage.py shell
>>> from app.models import Person

如何在iPython会话中添加此模型方法?

>>>    def is_midwestern(self):  
...        "Returns True if this person is from the Midwest."  
...        return self.state in ('IL', 'WI', 'MI', 'IN', 'OH', 'IA', 'MO')  

>>> person = Person.objects.filter(last_name='Franklin')
>>> person.is_midwestern
True

我希望能够测试这些模型方法,而无需将该方法添加到models.py文件中,然后重新启动iPython shell会话。

我似乎做错了,因为当我在交互式会话中添加新的模型方法时,它似乎没有像在文件中定义模型方法时那样链接到类。

因此,如果我创建了上面的模型方法并尝试使用它。 例如 '>>> person = Person.objects.filter(last_name ='Franklin')
>>> person.is_midwestern
'Person' object has no attribute
“is_midwestern'`

2 个答案:

答案 0 :(得分:7)

为什么你不能这样做 Person.is_midwestern = is_miswestern例如。

>>> class Person:
...     def __init__(self): self.mid = True
... 
>>> def is_midwestern(self): return self.mid
... 
>>> Person.is_midwestern = is_midwestern
>>> p = Person()
>>> p.is_midwestern()

True
>>> 

答案 1 :(得分:0)

接受的答案给了我一个错误,但是从this blog post开始,我使用了以下方法并且它有效。

from types import MethodType
Person.is_midwestern = MethodType(is_midwestern, p)