53 votes

Comment recharger une Django modèle de module à l'aide de la interactives interprète via "manage.py shell"?

Je sais comment le recharger régulièrement un module Python en Python interprète session. Cette question des documents de la façon de le faire assez bien:

Comment puis-je décharger (reload), un module Python?

Pour une raison quelconque, j'ai du mal à le faire au sein de Django reinhardt "manage.py coque" interprète de la session. Pour reproduire ce problème, démarrez la base de Django tutoriel trouvé ici:

La rédaction de votre premier Django app, partie 1

Après la création de la "sondages" de l'application et de "Sondage" de la classe, démarrage de l'interprète par "manage.py shell" et d'importer les "sondages" de l'app en elle.

import polls.models as pm

De créer un "nouveau Sondage" objet:

p = pm.Poll()

Tout est bien et bon jusqu'à présent. Maintenant, retournez à votre source et d'ajouter n'importe quelle méthode ou d'un attribut. Par exemple, j'ai ajouté:

def x(self):
    return 2+2

Maintenant, retournez à l'interprète et de "recharger" le module:

reload(pm)

Maintenant, essayez d'utiliser votre nouvelle méthode ou d'un attribut:

p1 = pm.Poll()
p1.x()

Vous obtiendrez ce message:

'Poll' object has no attribute 'x'

Ce qui donne? J'ai aussi essayé de réexécuter la commande importer, importer le module en utilisant une syntaxe différente, la suppression de toutes les références à un "Sondage" des objets ou le "Sondage" de la classe. J'ai aussi essayé avec à la fois l'interpréteur IPython et avec la plaine Python (v2.6) interprète. Rien ne semble fonctionner.

En utilisant les mêmes techniques avec l'arbitraire d'un module Python dans un interpréteur de session fonctionne parfaitement. Je n'arrive pas à le faire fonctionner dans de Django reinhardt, "coquille" de la session.

Par ailleurs, si cela fait une différence, je vais le faire sur une Ubuntu 9.04 de la machine.

38voto

Chad Braun-Duin Points 1401

Eh bien, je pense que je dois répondre à cela. Le problème est que Django caches de ses modèles dans un singleton (singleton comme la structure) appelé AppCache. En gros, pour recharger Django modèles, vous devez d'abord recharger et ré-importer tous les modules de modèle stocké dans le AppCache. Ensuite, vous devez effacer le AppCache. Voici le code:

import os
from django.db.models.loading import AppCache
cache = AppCache()

curdir = os.getcwd()

for app in cache.get_apps():
    f = app.__file__
    if f.startswith(curdir) and f.endswith('.pyc'):
        os.remove(f)
    __import__(app.__name__)
    reload(app)

from django.utils.datastructures import SortedDict
cache.app_store = SortedDict()
cache.app_models = SortedDict()
cache.app_errors = {}
cache.handled = {}
cache.loaded = False

J'ai mis tout cela dans un fichier séparé appelé reloadmodels.py dans le répertoire racine de mon site Django. À l'aide de IPython je peux recharger tout en exécutant:

%run ~/mysite/reloadmodels.py

6voto

mpaf Points 650

Vous pouvez également utiliser django-extensions de projet avec la commande suivante:

manage.py shell_plus --notebook

Cela va ouvrir une IPython notebook sur votre navigateur web au lieu de la IPython shell interprète. Écrire votre code, et de l'exécuter.

Lorsque vous changez vos modules, cliquez simplement sur la page web de l'élément de menu "Kernel->Redémarrer"

De ré-exécuter le code utilise maintenant vos modifications de modules.

5voto

Tomasz Zielinski Points 9300

Pour autant que je suis concerné, aucune des solutions ci-dessus ont travaillé sur leur propre, aussi ce thread n'a pas beaucoup d'aide sur son propre, mais après combinaison des approches, j'ai réussi à recharger mes modèles dans shell_plus:

  1. Apporter des modifications au modèle (Monmodèle)
  2. retirez models.pyc
  3. Nettoyer Django modèle de cache (comme ici):

     from django.db.models.loading import AppCache
     cache = AppCache()
     from django.utils.datastructures import SortedDict
     cache.app_store = SortedDict()
     cache.app_models = SortedDict()
     cache.app_errors = {}
     cache.handled = {}
     cache.loaded = False
    
  4. Recharger modèle comme ici

    reload(project.app.models)
    from project.app.models import MyModel
    

5voto

surtyaar Points 1553

En supposant que votre projet est configuré de cette manière

  • nom du projet : librairie
  • nom de l'application : durée de
  • nom du modèle : Livres

la première charge

from bookstore.shelf.models import Books

ultérieure de la recharge

import bookstore;reload(bookstore.shelf.models);from bookstore.shelf.models import Books

3voto

Lakshman Prasad Points 24002

console ipython un profond recharger avec chaque reload() expression; et bien sûr, ajoute beaucoup d'autres choses utiles.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X