【问题标题】:accessing model manager methods in datamigration在数据迁移中访问模型管理器方法
【发布时间】:2024-11-20 05:40:02
【问题描述】:

我正在尝试为我的一个应用制定数据迁移。我正在使用这里提到的信誉系统 - django-reputation

在我的forward 方法中,我有以下代码 -

orm['reputation.reputation'].objects.log_reputation_action(user = user_x, originating_user = user_y, action_value = 10, target_object = sample_obj)

但是在运行迁移时,我收到以下错误 -

AttributeError: 'Manager' object has no attribute 'log_reputation_action'

我在数据迁移中冻结了reputation 应用程序。请让我知道我在这里做错了什么。

提前致谢。

【问题讨论】:

    标签: django django-south data-migration


    【解决方案1】:

    看起来这是不可能的。

    来自South documentation

    您可以在数据迁移中使用此功能做更多事情;任何型号都可以 可供您使用。 唯一需要注意的是,您将无法访问 模型上的任何自定义方法或管理器,因为它们不是 作为冻结过程的一部分保存(没有办法做到这一点 一般来说);您必须将所需的任何代码复制到迁移中 本身。随意使它们成为 Migration 类的方法;南 忽略除了向前和向后之外的所有内容。

    【讨论】:

    • 猜我不得不以丑陋的方式去做。感谢引用!!
    • 如果您只打算向前迁移 - 您可以从真实模型中导入。请注意,这意味着只能现在应用此迁移。我已将其与数据迁移一起使用,将复杂的计算结果转换为真实列。
    【解决方案2】:

    从 Django 1.8 开始,您可以通过添加 use_in_migrations 属性在迁移中包含模型管理器。

    来自文档: https://docs.djangoproject.com/en/2.0/topics/migrations/#model-managers

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

    【讨论】:

    • 请务必先阅读此方法的后果。 “对 [...] 的引用和具有管理器 having use_in_migrations = True 的模型管理器声明在迁移中被序列化,因此函数和类需要保留,只要有迁移引用它们 。”摘自官方documentation 自定义亮点。
    • 有人有这方面的完整例子可以分享吗?
    【解决方案3】:

    通过迁移中的使用示例来扩充@mattdedek 的答案

    def my_migration_function(apps, schema_editor):
        MyModel = apps.get_model('my_app_name', 'MyModel')
        MyModel.objects.create(name='foo')
    
    
    class Migration(migrations.Migration):
        initial = True
    
        dependencies = [
            ...
        ]
    
        operations = [
            migrations.RunPython(my_migration_function),
        ]
    

    目前在 django 迁移中工作(在 3.0.4 版本上测试)

    【讨论】:

      最近更新 更多