2015-07-02 85 views
4

我有一個Django模型,該模型已經存在,我想重複,並且我找不到一個簡單的方法,因爲相關名稱衝突跨越ForeignKey s和ManyToMany s。如何創建具有M2M和FK關係的Django模型的精確副本

舉個例子,讓我們把模型我現在有Dog

class Dog(models.Model): 
    name = models.CharField() 
    owner = models.ForeignKey('myapp.Owner') 
    breeds = models.ManyToMany('myapp.Breed', help_text="Remember, animals can be mixed of multiple breeds.") 

我想使這種模式在其他地方使用完全相同的副本,與不同的數據庫表和名稱。我試着用abstract base class

class AnimalAbstract(models.Model): 
    name = models.CharField() 
    owner = models.ForeignKey('myapp.Owner') 
    breeds = models.ManyToMany('myapp.Breed', help_text="Remember, animals can be mixed of multiple breeds.") 

    class Meta: 
     abstract = True 

class Dog(AnimalAbstract): 
    pass 

class Cat(AnimalAbstract): 
    pass 

失敗的原因的related_name衝突。

是否有任何方法可以自動複製像這樣的模型,而不必明確重新定義每個ForeignKeyManyToMany

要搶先回答問題:是的,我知道multi-table inheritance,我不想使用它。我也知道,我可以簡單地將它們全部存儲在同一個表中,並使用proxy models自定義管理器來自動篩選出錯誤類型的動物,但我不希望那些—我希望它們在單獨的數據庫表上。

回答

2

https://docs.djangoproject.com/en/1.8/topics/db/models/#abstract-related-name

要解決此問題,當您在一個抽象基類(只)使用related_name,名稱的一部分應包含%(app_label)s%(class)s

  • %(class)s由該字段中所使用的子類的小寫名稱代替。
  • %(app_label)s由子類包含內的應用程序的小寫名稱代替。每個已安裝的應用程序名稱必須是唯一的,並且每個應用程序中的模型類名稱也必須是唯一的,因此結果名稱最終會有所不同。

例:

class Dog(models.Model): 
    name = models.CharField() 
    owner = models.ForeignKey(
     'myapp.Owner', 
     related_name="%(app_label)s_%(class)s_dogs") 

    breeds = models.ManyToMany(
     'myapp.Breed', 
     help_text="Remember, animals can be mixed of multiple breeds.", 
     related_name="%(app_label)s_%(class)s_dogs") 
相關問題