2015-02-24 32 views
3

我有以下型号如何假扮迁移不创建一个特定的现有中介表

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,因为我希望在这两个管理形式显示相同的中间表。他们还必须使用同一个表(不创建两个单独的表),因为一个管理员表单中的更改必须反映到另一个表单中。喜欢,如果我添加一个新的HareketVucutBolgesiHareketAdmin然后在VucutBolgesiAdmin也可以看到相同的结果。

为了达到这个目的,我首先从VucutBolgesi中删除hareketler M2M字段,所以Hareketler模型会创建中间表。我迁移这个,然后hareketlerVucutBolgesidb_table属性,所以它会识别相同的中间表。

领域的最终外观是folows

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, 
    ), 
] 

注:编辑相关的迁移文件和FO自Django的创建相同migrations.AddField每个makemigrations

回答

7

是否有可能使迁移始终是伪造的,只是重写apply和unapply方法。这样的后果还没有得到充分的调查,但是到目前为止它对我来说很有用。

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

​​
+0

这是一个生命的救星! – TAH 2017-03-17 15:29:29

3

溶液,所以不行去除migrations.AddField简单。

您必须确保相关迁移是唯一需要伪造的迁移操作。您必须首先创建

python manage.py makemigrations antrenman 

迁移然后申请,移民与--fake

python manage.py migrate --fake antrenman 

盘口,其他开发人员应该知道,他们必须相关的迁移。如果有其他人与此人一起迁移,他们应该先让他们为假冒这一个。

这太糟糕了,没有任何参数可以告诉相关迁移应该是真实的还是假的。

相关问题