Come si fa ad aggiungere un metodo modello per una classe esistente all'interno di una sessione interattiva (in ipython)?

StackOverflow https://stackoverflow.com/questions/1143833

  •  16-09-2019
  •  | 
  •  

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

È stato utile?

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)
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top