标签: django-migrations

如何通过引用外键将 Django 模型移动到其他应用程序?

这是这个问题的扩展:如何在两个 Django 应用程序之间移动模型 (Django 1.7)

我想使用 Django 迁移将模型 M 从应用程序 A 移动到应用程序 B,而不丢失数据。该问题的最佳投票答案(不是已接受的答案,而是ozan的答案)建议使用 migrations.SeparateDatabaseAndState 并分两步进行:

  1. 迁移以删除模型并重命名(而不是删除)数据库表。
  2. 迁移以创建新模型并使用现有表。

这对我来说看起来是一个非常聪明的方法,但是在我的例子中,有另一个模型 N 具有 M 的外键。现在,当我在第二步中调用 makemigrations 来制作迁移文件时,我收到一个错误,因为在那个阶段AM 模型已不复存在:

ValueError: Lookup failed for model referenced by field C.N.m: A.M  
Run Code Online (Sandbox Code Playgroud)

有办法处理这个问题吗?

python django django-migrations

4
推荐指数
1
解决办法
1829
查看次数

创建数据迁移自定义权限

我试图在迁移中创建自定义权限,但是运行 migrate 后,权限表中未创建该权限。有人能指出错误是什么吗?另外,我不确定应该使用什么作为 ContentType 的相关模型,因为该权限用于限制可以查看显示网站上用户摘要的页面的用户。任何帮助将不胜感激,谢谢。

def add_view_aggregated_data_permissions(apps, schema_editor):
    ContentType = apps.get_model('django', 'ContentType')
    Permission = apps.get_model('auth', 'Permission')
    content_type = ContentType.objects.get(app_label='auth', model='user')
    permission = Permission.objects.create(codename='can_view_data',
                                           name='Can view data',
                                           content_type=content_type)
Run Code Online (Sandbox Code Playgroud)

django django-permissions django-migrations

4
推荐指数
1
解决办法
4564
查看次数

删除的迁移文件 - 如何在不丢失数据的情况下进行迁移

我更改了模型类上的一个字段(没有类指向,只有一个外键指向它)。不知何故,这塞满了我的迁移,并且一直显示“django.db.migrations.graph.NodeNotFoundError:”寻找不存在的迁移文件。

我不小心删除了“迁移”文件夹中的几个文件。

我的数据库包含大量数据,我不想破坏它。

如果我执行以下操作,我会丢失任何数据吗:

  1. 删除首先导致问题的表(psql、\d、DROP TABLE 表名)

  2. 删除我所有的迁移文件

  3. 从头开始重新运行迁移?

    ./manage.py makemigrations

    ./manage.py 迁移

谁能推荐另一种方法来解决这个问题?

这是回溯: http: //dpaste.com/0Y1YDXS

django postgresql django-models django-migrations

4
推荐指数
1
解决办法
9513
查看次数

Django - 如何将列的所有值更改为空?

我有一个问题,我在模型中做了一些更改,因为我有一个整数字段必须更改为ForeignKey

derived_to对于错误,我将值 1分配给字段中的所有对象。

我现在想将此列中的所有行标记为空。我怎样才能做到这一点?这是我最后两次迁移

class Migration(migrations.Migration):

    dependencies = [
        ('work_order', '0026_auto_20170603_1517'),
    ]

    operations = [
        migrations.AlterModelOptions(
            name='workorder',
            options={'verbose_name': 'work order', 'verbose_name_plural': 'work orders'},
        ),
        migrations.AlterField(
            model_name='workorder',
            name='derived_to',
           field=models.ForeignKey(default=1, on_delete=django.db.models.deletion.CASCADE, to='store.OutsourceOption', verbose_name='outsource'),
        preserve_default=False,
    ),
]
Run Code Online (Sandbox Code Playgroud)

还有最后一张

class Migration(migrations.Migration):

    dependencies = [
        ('work_order', '0027_auto_20170605_0836'),
    ]

    operations = [
        migrations.AlterField(
            model_name='workorder',
            name='derived_to',
            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='store.OutsourceOption', verbose_name='outsource'),
        ),
    ]
Run Code Online (Sandbox Code Playgroud)

好吧,这就是我需要进行新的迁移以将 null 分配给列中 work_order 中的所有对象derived_to,因为现在所有对象都derived_to指向 OutsourceOptions 上的第一个寄存器,这是不正确的。

谢谢并为我糟糕的英语感到抱歉。

django django-models django-migrations

4
推荐指数
1
解决办法
3259
查看次数

卸载应用程序 A,因为应用程序 B 在一次旧迁移中具有依赖项

我正在尝试卸载名为 的应用程序django-cities,但在我的应用程序“位置”中,我有一个名为 的模型Venue,在迁移中该0001_initial.py模型的ForeingKeytocities.Subregion模型为django-cities

我继续删除django-citiesINSTALLED_APPS但出现以下错误:

Traceback (most recent call last):
  File "/home/d/.virtualenvs/beplay/local/lib/python2.7/site-packages/django/utils/autoreload.py", line 227, in wrapper
    fn(*args, **kwargs)
  File "/home/d/.virtualenvs/beplay/local/lib/python2.7/site-packages/django/core/management/commands/runserver.py", line 128, in inner_run
    self.check_migrations()
  File "/home/d/.virtualenvs/beplay/local/lib/python2.7/site-packages/django/core/management/base.py", line 422, in check_migrations
    executor = MigrationExecutor(connections[DEFAULT_DB_ALIAS])
  File "/home/d/.virtualenvs/beplay/local/lib/python2.7/site-packages/django/db/migrations/executor.py", line 20, in __init__
    self.loader = MigrationLoader(self.connection)
  File "/home/d/.virtualenvs/beplay/local/lib/python2.7/site-packages/django/db/migrations/loader.py", line 52, in __init__
    self.build_graph()
  File "/home/d/.virtualenvs/beplay/local/lib/python2.7/site-packages/django/db/migrations/loader.py", line 274, in build_graph
    raise exc
django.db.migrations.exceptions.NodeNotFoundError: Migration places.0001_initial dependencies reference nonexistent parent …
Run Code Online (Sandbox Code Playgroud)

python django django-models django-migrations

4
推荐指数
1
解决办法
1923
查看次数

Django:django.db.utils.IntegrityError:(1215,'无法添加外键约束')

新的迁移(添加一个简单的表)在迁移过程中给出错误“无法添加外键约束”。

这是一个现有的模型,称为EventLog

class EventLog(models.Model):
    """
    The event log.
    """
    user = models.ForeignKey(User, blank=True, null=True)
    timestamp = models.DateTimeField(auto_now=True)
    text = models.TextField(blank=True, null=True)
    ip = models.CharField(max_length=15)
    metadata = JSONField(default={},blank=True)
    product = models.TextField(default=None,blank=True, null=True)
    type = models.ForeignKey(EventType)

    def __unicode__(self):
        return "[%-15s]-[%s] %s (%s)" % (self.type, self.timestamp, self.text, self.user)

    def highlite(self):
        if self.type.highlite:
            return self.type.highlitecss
        return False
Run Code Online (Sandbox Code Playgroud)

这是我正在尝试创建的新模型:

class EventLogDetail(models.Model):
    # NOTE: I've already tried switching 'EventLog' out for just EventLog.
    eventlog = models.ForeignKey('EventLog', related_name='details')
    order = models.IntegerField(default=0)
    line = models.CharField(max_length=500)

    class …
Run Code Online (Sandbox Code Playgroud)

django django-migrations

4
推荐指数
1
解决办法
1万
查看次数

Django GenericForeignKey 更新

我正在尝试在 django 中将外键转换为 GenericForeignKey。我计划在三个迁移中执行此操作:mig1、mig2、mig3。

迁移1(mig1)有以下代码

class Migration(migrations.Migration):

    dependencies = [
        ('contenttypes', '0002_remove_content_type_name'),
        ('post_service', '0008_auto_20180802_1112'),
    ]

    operations = [
        migrations.AddField(
            model_name='comment',
            name='content_type',
            field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='contenttypes.ContentType'),
        ),
        migrations.AddField(
            model_name='comment',
            name='object_id',
            field=models.PositiveIntegerField(null=True),
        ),
    ]
Run Code Online (Sandbox Code Playgroud)

迁移2(mig2)有以下代码

def change_posts_to_generic_key_comment(apps, schema_editor):
    Comment  = apps.get_model('post_service', 'Comment')
    db_alias = schema_editor.connection.alias
    comments = Comment.objects.using(db_alias).all()
    for comment in comments:
        Comment.objects.filter(id=comment.id).update(content_object=comment.post)

def reverse_change_posts_to_generic_key_comment(apps, schema_editor):
    Comment  = apps.get_model('post_service', 'Comment')
    db_alias = schema_editor.connection.alias
    comments = Comment.objects.using(db_alias).all()
    for comment in comments:
        Comment.objects.filter(id=comment.id).update(content_object=)

class Migration(migrations.Migration):

    dependencies = [
        ('post_service', '0009_auto_20180802_1623'),
    ]

    operations = [
        migrations.RunPython(change_posts_to_generic_key_comment, …
Run Code Online (Sandbox Code Playgroud)

django generic-foreign-key django-migrations

4
推荐指数
1
解决办法
2783
查看次数

将 PositiveIntegerField 迁移到 FloatField

我有一个现有的填充数据库,并且想将 a 转换PositiveIntegerFieldFloatField. 我正在考虑简单地进行迁移:

    migrations.AlterField(
        model_name='mymodel',
        name='field_to_convert',
        field=models.FloatField(
            blank=True,
            help_text='my helpful text',
            null=True),
    ),
Run Code Online (Sandbox Code Playgroud)

该字段当前定义为:

field_to_convert = models.PositiveIntegerField(
    null=True,
    blank=True,
    help_text='my helpful text')
Run Code Online (Sandbox Code Playgroud)

这是否需要完全重写数据库列?对于更大的数据库来说,这种转换的扩展效果如何?如果绝大多数值都是 的话,它会如何扩展null?什么情况下这种转换会失败?如果有区别的话,这是由 Postgres 数据库支持的。

database django postgresql django-models django-migrations

4
推荐指数
1
解决办法
1355
查看次数

Django 迁移:“elidable”参数的用途是什么?

RunPython在迁移中进行了操作,例如其中一项迁移:

class DataMigration(migrations.Migration):
    dependencies = [('app1', '0001_initial')]

    operations = [
        migrations.RunPython(create_data, delete_data, elidable=True),
    ]
Run Code Online (Sandbox Code Playgroud)

此操作接受一个可选参数,该参数在Django 文档elidable中进行了描述:

可选的 Elidable 参数确定在压缩迁移时是否删除(消除)该操作。

这个描述让我有点困惑。elidable=True我的问题是:当带标志的迁移被压制时会发生什么?

我想迁移 withelidable=True会被简单地删除。并且必须采取一些手动步骤才能将删除的迁移逻辑添加到压缩的迁移逻辑中。

django python-3.x django-migrations

4
推荐指数
1
解决办法
2261
查看次数

如何忽略特定的迁移?

我有这样的迁移:

class Migration(migrations.Migration):

    dependencies = [
        ('app', '0020_auto_20191023_2245'),
    ]

    operations = [
        migrations.AddField(
            model_name='agenda',
            name='theme',
            field=models.PositiveIntegerField(default=1),
        ),
    ]
Run Code Online (Sandbox Code Playgroud)

但它会引发一个错误:

django.db.utils.ProgrammingError: column "theme" of relation "app_agenda" already exists
Run Code Online (Sandbox Code Playgroud)

没问题,我已经像这样包装了这个错误:

from django.db import migrations, models, ProgrammingError


def add_field_theme_to_agenda(apps, schema_editor):
    try:
        migrations.AddField(
            model_name='agenda',
            name='theme',
            field=models.PositiveIntegerField(default=1),
        ),
    except ProgrammingError as e:  # sometimes it can exist
        if "already exists" not in str(e):
            raise


class Migration(migrations.Migration):
    dependencies = [
        ('app', '0020_auto_20191023_2245'),
    ]
    operations = [
        migrations.RunPython(add_field_theme_to_agenda),
    ]
Run Code Online (Sandbox Code Playgroud)

这就像一个魅力,所有以下迁移都已完成。

我的问题是,每次我运行“ makemigrations”时,Django都会再次添加迁移(=我的问题顶部的迁移)。我想这是因为它在迁移中没有看到它,因为我的代码混淆了它。

如何使用迁移来规避此问题(不要说“这个问题出在您的数据库上,请更正您的数据库”之类的答案)?

django django-migrations

4
推荐指数
1
解决办法
3776
查看次数