1

我正在使用 Django 代码片段的这个小宝石从两个方向编辑 ManyToManyField:

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' )

(此处摘录详细信息)

它让我可以从工作表单中选择给定工作中的所有人员,并反过来让我从人员表单中选择一个人的所有工作,并在这两种情况下更新单个 jobs_persons 表。

然而,从 Django 1.0 迁移到 1.2 后,syncdb 现在会生成重复表错误,因为 create_table 显然不再是基类中受支持的属性。

是否有另一种方法来指示 Django 1.2 不要为相关字段创建表?

4

3 回答 3

2

模型的“托管”元选项可能会有所帮助。来自http://docs.djangoproject.com/en/1.2/ref/models/options/#managed

如果 managed=False 的模型包含指向另一个非托管模型的 ManyToManyField,则也不会创建多对多连接的中间表。但是,将创建一个托管模型和一个非托管模型之间的中间表。

如果您需要更改此默认行为,请将中间表创建为显式模型(根据需要使用托管集)并使用 ManyToManyField.through 属性使关系使用您的自定义模型。

于 2011-02-05T18:24:35.050 回答
1

因此,如果您想在 Admin 中访问两个模型中的 ManyToMany,目前官方的解决方案是使用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

不幸的是,如果您使用Southapp_user_group ,则必须在自动创建的每个迁移文件中删除表的创建。

于 2011-02-05T20:57:13.050 回答
1

让我在 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)
于 2012-02-14T10:00:55.847 回答