2015-02-24 30 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 

盤口,其他開發人員應該知道,他們必須相關的遷移。如果有其他人與此人一起遷移,他們應該先讓他們爲假冒這一個。

這太糟糕了,沒有任何參數可以告訴相關遷移應該是真實的還是假的。

相關問題