2016-10-31 32 views
11

Przepuściłem migrację ForeignKey do GenericForeignKey przy użyciu szkieletu contrib.contenttypes. Aby uzyskać dostęp do obiektu ContentType muszę migrować dane, użyłem tego kodu:Django: Typy ContentTypes podczas migracji podczas wykonywania testów

ContentType = apps.get_model('contenttypes', 'ContentType') 

my_model_content_type = ContentType.objects.get(
    app_label='my_app', 
    model='my_model' 
) 

Migracja działa gdy uruchamiam manage.py migrate i mogę wtedy grać z zaktualizowanego modelu w powłoce bez problemów.

Jednak gdy próbuję uruchomić manage.py test, pojawia się następujący błąd w linii ContentTypes.object.get():

__fake__.DoesNotExist: ContentType matching query does not exist. 

Zapytania na ContentType.objects.all() w tym czasie zwraca pusty queryset.

próbowałem (jak kierowany przez inną odpowiedź tutaj w SO), aby uruchomić ten przed moim zapytaniu, ale bezskutecznie:

update_contenttypes(apps.app_configs['contenttypes']) 
update_contenttypes(apps.app_configs['my_app']) 

Skąd mogę mieć pewność, że ContentType wiersze istnieć w tym momencie w przetestować migrację bazy danych?

Odpowiedz

4

To właśnie dla mnie zadziałało. Po pierwsze, import update_contenttypes:

from django.contrib.contenttypes.management import update_contenttypes 

drugie, listy wstępnej ContentType migrację jako zależność:

dependencies = [ 
    ('contenttypes', '0001_initial'), 
    ... 
] 

Wreszcie w funkcji forward migracji (wywoływanego przez RunPython w migracji operations):

# Ensure ContentType objects exist at this point: 
app_config = apps.get_app_config('my_app') 
app_config.models_module = app_config.models_module or True 

update_contenttypes(app_config) 

Może być konieczne uruchomienie powyższego kodu dla więcej niż jednego app_config. Możesz uzyskać wszystkie obiekty app_config przy użyciu apps.get_app_configs() i iterować.

+1

To nie działa w wersji 1.11: 'od django.contrib.contenttypes.management import update_contenttypes' –

+1

https://code.djangoproject.com/ticket/28092 Zmieniono nazwę na create_contenttypes –

+0

To działało dla mnie w Django 1.11 przy użyciu zmieniono nazwę na "update_contenttypes". – Franey