J'ai un gestionnaire de modèles personnalisé utilisé dans plusieurs de mes modèles. Ce gestionnaire permet d'accélérer les insertions de bases de données. J'ai besoin d'effectuer une migration de données, et cela implique la migration de plusieurs millions d'enregistrements / objets. J'ai besoin de mon gestionnaire personnalisé dans ma migration de données. Quelqu'un sait-il comment l'obtenir. Dans le contexte de la migration de données, si j'exécute model.objects
, cela me rend le gestionnaire de modèles de Django.
3 Réponses :
Pourquoi ne pas simplement importer votre modèle?
from myproj.models import MyModel MyModel.objects.filter(field=value).update(field=new_value)
Dans le contexte de migration de données, vous ne pouvez pas exécuter de requêtes sur un modèle importé, comme vous l'avez suggéré. Vous devez obtenir la classe de modèle à l'aide du paramètre de registre passé dans l'application: def data_migration (apps, schema_editor): model = apps.get_model ('myApp', 'myModel')
Pour le moment, l'approche que j'utilise, et qui semble fonctionner de manière fiable, consiste à instancier un Manager local pour le modèle, puis à définir l'attribut de modèle du manager sur le modèle qui m'intéresse:
class MyManager(Manager): ... def my_create_func(self): ... class MyModel(Model): ... objects = MyManager() def data_migration(apps, schema_editor): model = apps.get_model(...) manager = MyManager() manager.model = model manager.my_create_func()
Vous pouvez également utiliser l'attribut use_in_migrations
du Manager (docs ):
class MyManager(models.Manager): use_in_migrations = True class MyModel(models.Model): objects = MyManager()
J'ai trouvé AlterModelManager dans les documents de migration de Django. Mais on ne sait pas comment l'utiliser. Je ne peux pas non plus trouver d'exemples en ligne.