【问题标题】:How do I access my model's custom manager in a Django data migration context?如何在 Django 数据迁移上下文中访问模型的自定义管理器?
【发布时间】:2019-02-01 14:58:51
【问题描述】:

我的几个模型中使用了一个自定义模型管理器。该管理器有助于加快数据库插入。我需要执行数据迁移,它涉及迁移数百万条记录/对象。我的数据迁移需要我的自定义管理器。有谁知道如何得到它。在数据迁移上下文中,如果我运行 model.objects 这将返回 Django 的模型管理器。

【问题讨论】:

  • 我在 Django 的迁移文档中找到了 AlterModelManager。但目前尚不清楚如何使用它。我在网上也找不到任何例子。

标签: django django-models migration django-managers


【解决方案1】:

到目前为止,我正在使用并且似乎可靠地工作的方法是为模型实例化一个本地管理器,然后将管理器的模型属性设置为我感兴趣的模型:

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

【讨论】:

    【解决方案2】:

    也可以使用Manager的use_in_migrations属性(docs):

    class MyManager(models.Manager):
        use_in_migrations = True
    
    class MyModel(models.Model):
        objects = MyManager()
    

    【讨论】:

      【解决方案3】:

      为什么不直接导入您的模型?

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

      【讨论】:

      • 在数据迁移上下文中,您不能像您建议的那样对导入的模型运行查询。您必须使用传入的应用程序注册表参数获取模型类: def data_migration(apps, schema_editor): model = apps.get_model('myApp', 'myModel')
      猜你喜欢
      • 1970-01-01
      • 2015-01-21
      • 2011-04-20
      • 1970-01-01
      • 1970-01-01
      • 2015-08-20
      • 2013-05-13
      • 1970-01-01
      相关资源
      最近更新 更多