Estoy escribiendo un script de migración de Django personalizado. Según los documentos de django sobre migraciones personalizadas , debería poder usar mi modelo con respecto a apps.get_model() . Sin embargo, al intentar hacer esto me sale el siguiente error:
AttributeError: type object 'MyModel' has no attribute 'objects'Creo que esto tiene que ver con que el registro de aplicaciones no está listo, pero no estoy seguro.
Código de muestra:
def do_thing(apps, schema_editor): my_model = apps.get_model('app', 'MyModel') objects_ = my_model.objects.filter( some_field__isnull=True).prefetch_related( 'some_field__some_other_field') # exc raised here class Migration(migrations.Migration): atomic = False dependencies = [ ('app', '00xx_auto_xxx') ] operations = [ migrations.RunPython(do_thing), ] Una declaración de impresión simple del valor de retorno de apps.get_model() muestra lo siguiente: <class '__fake__.MyModel'> . No estoy seguro de qué es esto, y si es el resultado de no estar preparado.
EDITAR:
No pude encontrar ningún recurso para explicar por qué obtengo un objeto __fake__ , así que decidí jugar con el código. Conseguí que funcionara adelantándose a las apps de los argumentos, como se puede ver aquí:
def do_thing(apps, schema_editor): from django.apps import apps my_model = apps.get_model('app', 'MyModel') objects_ = my_model.objects.filter( some_field__isnull=True).prefetch_related( 'some_field__some_other_field') # no more exc raised hereTodavía estoy confundido y cualquier ayuda sería apreciada.
Los objetos falsos son modelos históricos . Aquí está la explicación de Django docs :
Cuando ejecuta migraciones, Django trabaja a partir de versiones históricas de sus modelos almacenados en los archivos de migración.
[...]
Debido a que es imposible serializar código Python arbitrario, estos modelos históricos no tendrán ningún método personalizado que haya definido. Sin embargo, tendrán los mismos campos, relaciones, administradores (limitados a aquellos con
use_in_migrations = True) y opciones Meta (también versionadas, por lo que pueden ser diferentes de las actuales).
En caso de que los objects sean un administrador personalizado, puede configurar use_in_migrations = True para que esté disponible en las migraciones.