2011-02-05 62 views
1

我使用一個Django代碼片段的這個小寶石編輯從兩個方向ManyToManyField:如何讓Django不要爲M2M相關字段創建表格?

class ManyToManyField_NoSyncdb(models.ManyToManyField): 
    def __init__(self, *args, **kwargs): 
     super(ManyToManyField_NoSyncdb, self).__init__(*args, **kwargs) 
     self.creates_table = False 

class Job(models.Model): 
    persons = ManyToManyField_NoSyncdb(Person, blank=True, db_table='person_jobs') 

(片段細節here

它讓我選擇從給定作業的所有人員就業形式,反過來讓我從個人形式中選擇一個人的所有工作,並在兩種情況下更新單個jobs_persons表。

但是,從Django 1.0遷移到1.2時,syncdb現在會生成重複表錯誤,因爲creates_table顯然不再是基類中受支持的屬性。

是否有另一種方式指示Django 1.2不要爲相關字段創建表格?

回答

1

所以,如果你想在在管理這兩款車型進入多對多,目前官方解決方案是使用inlinemodel第二模型。就在幾天前,我也有同樣的問題/需求。我並不十分滿意inlinemodel解決方案(如果您有很多條目,不能使用filter_horizontal小部件等,那麼在數據庫查詢中很沉重)。

我找到了解決方案(即的工作與Django的1.2+和syncdb)是這樣的:

class User(models.Model): 
    groups = models.ManyToManyField('Group', through='UserGroups') 

class Group(models.Model): 
    users = models.ManyToManyField('User', through='UserGroups') 

class UserGroups(models.Model): 
    user_id = models.ForeignKey(User) 
    group_id = models.ForeignKey(Group) 

    class Meta: 
     db_table = 'app_user_group' 
     auto_created = User 

見票897獲取更多信息。

不幸的是,如果您使用的是South,則必須在每個自動創建的遷移文件中刪除創建的app_user_group表。

+0

這很好。非常感謝你的幫助。 – jwilson2000 2011-02-17 07:01:48

2

模型的「託管」元選項可能會有幫助。從http://docs.djangoproject.com/en/1.2/ref/models/options/#managed

如果與管理= false一個模型包含 指向 其他非託管模式,那麼對於 許多一對多加入也不會被 創建 中間表ManyToManyField。但是,將創建一個託管模塊和一個 非託管模型之間的中間表 表。

如果您需要更改此默認 行爲,建立中介 表作爲一個明確的模式(與 管理的根據需要設置),並使用 ManyToManyField.through屬性 使關係使用自定義 模型。

1

讓我張貼new solution在Django的門票#897,也由Etienne提及。它在Django 1.2中運行良好。

class Test1(models.Model): 
    tests2 = models.ManyToManyField('Test2', blank=True) 

class Test2(models.Model): 
    tests1 = models.ManyToManyField(Test1, through=Test1.tests2.through, blank=True)