Nasıl Django model bir modül&; manage.py shell&""); etkileşimli yorumlayıcı kullanarak yeniden musunuz?
Düzenli Python yorumlayıcısı bir oturum içinde düzenli bir Python modülü yeniden nasıl biliyorum. Bu oldukça iyi yapmak için nasıl belgeleri soru:
How do I unload (reload) a Python module?
Nedense, sorun Django "shell" tercüman oturum. manage.py içinde bunu yaşıyorum Benim sorunu yeniden oluşturmak için, temel Django öğretici buldum
Writing your first Django app, part 1
""Uygulama ve "Anket" sınıfı, "" ve "" app içine. anketler, ithalat manage.py kabuk üzerinden yorumlayıcı başlangıç anketler oluşturduktan sonra
import polls.models as pm
Yeni oluştur "Anket" nesne:
p = pm.Poll()
Ve şimdiye kadar iyi. Şimdi kaynağa geri dönmek ve eklemek rasgele herhangi bir yöntem veya öznitelik. Örneğin, ekledim:
def x(self):
return 2 2
Artık tercümana dönüp "modülü yeniden yerleştirin
reload(pm)
Şimdi yeni yöntemi kullanın veya öznitelik deneyin:
p1 = pm.Poll()
p1.x()
Bu ileti alırsınız:
'Poll' object has no attribute 'x'
Ne veriyor? Ayrıca Al komutunu yeniden çalıştırmadan, modülü farklı bir sözdizimi kullanarak içe, tüm başvurular "" nesneleri veya "" sınıf. Ankete Anket için herhangi bir silme denedim Ayrıca düz Python (v2.hem İPython tercüman olan bu ve denedim 6) tercüman. Hiçbir şey iş gibi görünüyor.
Normal sözlü bir oturum keyfi Python modülü ile aynı teknikleri kullanarak mükemmel çalışıyor. Ben sadece "" oturumu. Shell'in içinde Django işe almak gibi olamaz
Eğer bir önemi varsa bu arada, Ubuntu 9.04 bir makinede yapıyorum.
CEVAP
Peki, bu cevap vermek zorunda olduğumu düşünüyorum. Sorun Django önbelleğe bir singleton modelleri (singleton gibi bir yapı) AppCache denir. Temelde, Django modelleri yeniden ilk ve yeniden ithal tüm model modülleri AppCache saklanan yeniden yükleyin. Sonra AppCache temizlemek gerekir. İşte bunun için kod:
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
Ayrı bir dosya Django sitemin kök dizininde reloadmodels.py denilen bütün bunları koydum. İPython çalıştırarak her şeyi yükleme yapabilirim kullanarak:
%run ~/mysite/reloadmodels.py
Model alan Güney kullanarak yeniden ad...
Kolay bir model Django kullanarak yeni...
Nasıl bir uygulama yeniden'bağıml...
Nasıl HTML kodu Sublime Text 2 kullana...
Nasıl bir sayfa Javascript kullanarak ...