Как добавить метод модели в существующий класс в интерактивном сеансе (в iPython)? - PullRequest
1 голос
/ 17 июля 2009

У меня есть базовая модель:

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<br> 'Person' object has no attribute is_midwestern'`

Ответы [ 2 ]

7 голосов
/ 17 июля 2009

почему ты не можешь просто сделать это 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
>>> 
0 голосов
/ 15 июня 2018

Принятый ответ дал мне ошибку, но из этого сообщения в блоге я использовал следующий метод, и он сработал.

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