2016-10-31 4 views
11

Ich migrierte eine ForeignKey in eine GenericForeignKey, unter Verwendung der contrib.contenttypes Framework. Für den Zugriff auf das Objekt ContentType Ich brauche die Daten zu migrieren, habe ich diesen Code:Django: ContentTypes während der Migration während der Tests

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

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

Die Migration funktioniert, wenn ich manage.py migrate laufen, und dann kann ich mit dem aktualisierten Modell in der Schale ohne Probleme spielen.

Allerdings, wenn ich versuche, manage.py test zu laufen ließe, erhalte ich folgende Fehlermeldung in der ContentTypes.object.get() Linie:

__fake__.DoesNotExist: ContentType matching query does not exist. 

Abfragen von ContentType.objects.all() zu diesem Zeitpunkt gibt eine leere queryset.

Ich habe versucht (wie in SO von einer anderen Antwort hier gerichtet) diese vor meiner Anfrage zu laufen, aber ohne Erfolg:

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

Wie kann ich sicherstellen, dass die ContentType Reihen an diesem Punkt gibt es in der Datenbank-Migration testen?

Antwort

4

Das ist, was am Ende für mich arbeitete. Zuerst importieren update_contenttypes:

from django.contrib.contenttypes.management import update_contenttypes 

Zweitens Liste der anfänglichen ContentType Migration als Abhängigkeit:

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

schließlich in der forward Migrationsfunktion (über RunPython in der Migration aufgerufen 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) 

Möglicherweise müssen Sie den obigen Code für mehr als eineausführen. Sie können alle app_config Objekte mit apps.get_app_configs() abrufen und iterieren.

+1

Dies funktioniert nicht in 1.11: 'von django.contrib.contenttypes.management Import update_contenttypes' –

+1

https://code.djangoproject.com/ticket/28092 Umbenannt –

+0

create_contenttypes Dieser arbeitete für mich in Django 1.11 die Verwendung von umbenannt in 'update_contenttypes'. – Franey

Verwandte Themen