Come si fa ad aggiungere un metodo modello per una classe esistente all'interno di una sessione interattiva (in ipython)?
Domanda
Ho un modello di base:
class Person(models.Model):
first_name = models.CharField(max_length=50)
last_name = models.CharField(max_length=50)
state = USStateField()
Comincio una sessione ipython con:
$ python manage.py shell
>>> from app.models import Person
Come faccio ad aggiungere questo metodo il modello all'interno della sessione 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
Voglio essere in grado di testare questi metodi modello senza dover aggiungere il metodo al file models.py e riavviando la sessione di shell ipython.
Mi sembra di fare qualcosa di sbagliato, perché quando aggiungo un nuovo metodo dei modelli in una sessione interattiva, non sembra essere legata alla classe come fa quando il metodo del modello è definito in un file.
Quindi, se ho creato il metodo di modello come sopra e tentato di usarlo.
per esempio.
'>>> persona = Person.objects.filter (cognome =' Franklin')
>>> person.is_midwestern
'is_midwestern'`
'Person' object has no attribute
Soluzione
perché non si può solo fare questo Person.is_midwestern = is_miswestern es.
>>> 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
>>>
Altri suggerimenti
La risposta accettata mi ha dato un errore, ma da questo post del blog , ho usato il seguente metodo e ha funzionato.
from types import MethodType
Person.is_midwestern = MethodType(is_midwestern, p)