1
votes

Comment accéder au gestionnaire personnalisé de mon modèle dans un contexte de migration de données Django?

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.


1 commentaires

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.


3 Réponses :


0
votes

Pourquoi ne pas simplement importer votre modèle?

from myproj.models import MyModel
MyModel.objects.filter(field=value).update(field=new_value)


1 commentaires

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')



1
votes

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()


0 commentaires

0
votes

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()


0 commentaires