Próbuję użyć obiektów admin.LogEntry podczas datamigration na Django 1.7
The "django.contrib.admin"
aplikacja jest na liście INSTALLED_APPS
.
W powłoce działa:
>>> from django.apps import apps
>>> apps.get_model("admin", "LogEntry")
django.contrib.admin.models.LogEntry
Ale podczas migracji nie działa:
def do_it(apps, schema_editor):
LogEntry = apps.get_model("admin", "LogEntry")
Fails jak poniżej:
django-admin migrate
(...)
LookupError: No installed app with label "admin".
Używając debuggera, dostałem informację, że "admin" nie jest zainstalowany:
ipdb> apps.get_apps()
[]
ipdb> apps.all_models.keys()
["website", "google", "allauth", "twitter", "busca", "conteudo", "django_mobile", "django_filters", "videocenter", "tinymce", "oferta", "programacaotv", "contenttypes", "suit", "haystack", "destaque", "filer", "galeria", "auth", "facebook", "paintstore", "critica", "disqus", "fichas", "omeletop", "autocomplete_light", "modelsv1", "temas", "django_extensions", "adv_cache_tag", "taggit", "social", "personalidade"]
CZEMU??
Odpowiedzi:
9 dla odpowiedzi № 1Nie znam dokładnej przyczyny tego, będę musiał zagłębić się w kod źródłowy, ale na razie można dodać obejście
("admin", "name_of_last_migration_in_admin_app")
do zależności, a migracje przebiegają pomyślnie.
3 dla odpowiedzi № 2
The Django doc wyjaśnia:
Podczas pisania a RunPython funkcja korzystająca z modeli z aplikacji innych niż ta, w której znajduje się migracja, z migracji zależności atrybut powinien zawierać najnowszą migrację każdej aplikacji, która jest zaangażowana, w przeciwnym razie może pojawić się błąd podobny do: LookupError: Brak zainstalowanej aplikacji z etykietą "myappname" kiedy próbujesz odzyskać model w RunPython funkcja za pomocą apps.get_model ().
Przykład kodu:
class Migration(migrations.Migration):
dependencies = [
("app1", "0001_initial"),
# added dependency to enable using models from app2 in move_m1
("app2", "0004_foobar"),
]
operations = [
migrations.RunPython(move_m1),
]