django - 如何伪造迁移以不创建特定的现有中间表

标签 django django-1.7 django-migrations

我有以下型号

class VucutBolgesi(models.Model):
    site = models.ForeignKey(Site)
    bolge = models.CharField(verbose_name="Bölge", max_length=75)
    hareketler = models.ManyToManyField("Hareket", verbose_name="Hareketler", null=True, blank=True, help_text="Bölgeyi çalıştıran hareketler")


class Hareket(models.Model):
    site = models.ForeignKey(Site)
    hareket = models.CharField(verbose_name="Hareket", max_length=75 )
    bolgeler = models.ManyToManyField(VucutBolgesi, verbose_name="Çalıştırdığı Bölgeler", null=True, blank=True,
                                      help_text="Hareketin çalıştırdığı bölgeler")

我在两个表上都有相同的 M2M,因为我希望在两个管理表单上显示相同的中间表。他们还必须使用同一个表(而不是创建两个单独的表),因为一个管理表单中的一个更改必须反射(reflect)到另一个。就像,如果我添加一个新的 HareketVucutBolgesi通过 HareketAdmin那么相同的结果应该在 VucutBolgesiAdmin 上可见也。

为了实现这一点,我首先删除了 hareketler M2M 领域来自 VucutBolgesi所以Hareketler模型将创建中间表。我迁移这个然后添加 hareketlerVucutBolgesidb_table属性,因此它将识别相同的中间表。

该领域的最终外观如下
hareketler = models.ManyToManyField("Hareket", verbose_name="Hareketler", db_table="antrenman_hareket_bolgeler",
                                    null=True, blank=True, help_text="Bölgeyi çalıştıran hareketler")

当我尝试迁移它时,django 抛出以下异常
django.db.utils.OperationalError: table "antrenman_hareket_bolgeler" already exists

我应该如何伪造这种迁移?

以下是每次运行时 django 创建的迁移 makemigrations
dependencies = [
    ('antrenman', '0005_vucutbolgesi_hareketler'),
]

operations = [
    migrations.AddField(
        model_name='vucutbolgesi',
        name='hareketler',
        field=models.ManyToManyField(to='antrenman.Hareket', db_table=b'antrenman_hareket_bolgeler', blank=True, help_text=b'B\xc3\xb6lgeyi \xc3\xa7al\xc4\xb1\xc5\x9ft\xc4\xb1ran hareketler', null=True, verbose_name=b'Hareketler'),
        preserve_default=True,
    ),
]

注意:编辑相关迁移文件并删除 migrations.AddField fo 不起作用,因为 django 创建了相同的 migrations.AddField与每个 makemigrations

最佳答案

是否可以始终伪造迁移,只需覆盖 apply 和 unapply 方法。这样做的后果没有得到充分调查,但到目前为止它对我有用。

在以下示例中,我们创建了一个重用 django.contrib.auth.User.group 的迁移。的M2M表b'profile_user_groups :

from __future__ import unicode_literals

from django.db import migrations, models


class Migration(migrations.Migration):

    dependencies = [
        ('profile', '0001_initial'),
    ]

    operations = [
        migrations.AddField(
            model_name='user',
            name='organizations',
            field=models.ManyToManyField(db_column=b'group_id', db_table=b'profile_user_groups', related_name='members', to='profile.Organization'),
        ),
    ]

    def apply(self, project_state, schema_editor, collect_sql=False):
        return project_state.clone()

    def unapply(self, project_state, schema_editor, collect_sql=False):
        return project_state.clone()

关于django - 如何伪造迁移以不创建特定的现有中间表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28693691/

相关文章:

python-3.x - Django 上的 MakeMigration 错误 - ImportError : cannot import name 'FieldDoesNotExist' from 'django.db.models'

django - 重新运行 Django 数据迁移

django - 由于旧迁移而发出警告 - 应该如何解决?

django - 从 Django 1.4 升级到 Django 1.7 - 可以吗?

python - 为什么 Django 为 help_text 和 verbose_name 更改进行迁移?

django - django 测试是否有一个类似于 setUp() 的breakDown(),在所有测试完成后运行?

python - 在哪里放置应用程序在 Django 中?

django - __init__() 获得意外的关键字参数 'mimetype'

python - 操作错误 : database is locked

python - Django Makemigrations 和 Migrate 不断重复