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

1 投票
2 回答
1048 浏览
提问于 2025-04-15 12:58

我有一个基本的模型:

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的会话。

我感觉我做错了什么,因为当我在交互式会话中添加一个新的模型方法时,它似乎没有像在文件中定义时那样与类关联起来。

所以如果我像上面那样创建了模型方法,然后尝试使用它,比如:

' >>> person = Person.objects.filter(last_name='Franklin')
>>> person.is_midwestern
'Person'对象没有属性
'is_midwestern'`

2 个回答

0

被接受的答案让我遇到了错误,不过我从这篇博客上找到了一个方法,结果成功了。

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

为什么你不能直接这样做呢?

比如说,给一个人设置一个属性,判断他是不是中西部人,可以写成这样:

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

撰写回答