如何告诉Django不要为M2M相关字段创建表?

如何告诉Django不要为M2M相关字段创建表?,django,manytomanyfield,Django,Manytomanyfield,我正在使用Django代码片段中的这颗宝石从两个方向编辑一个ManyToManyField: class ManyToManyField_NoSyncdb(models.ManyToManyField): def __init__(self, *args, **kwargs): super(ManyToManyField_NoSyncdb, self).__init__(*args, **kwargs) self.creates_table = F

我正在使用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表单中为一个人选择所有工作,并在这两种情况下更新single jobs_persons表

但是,在从Django 1.0迁移到1.2时,syncdb现在会生成一个重复的表错误,因为creates_table显然不再是基类中支持的属性


是否有其他方法指示Django 1.2不要为RelatedField创建表?

模型的托管元选项可能会有所帮助。从

如果managed=False的模型包含 指向 另一个非托管模型,然后是 中间表 多对多的加入也不会被取消 创建。然而,中介 一个托管和一个托管之间的表 将创建非托管模型

如果需要更改此默认值 行为,创造中介 表作为带有 根据需要设置托管集并使用 ManyToManyField.through属性为 让关系使用你的习惯 模型


模型的托管元选项可能会有所帮助。从

如果managed=False的模型包含 指向 另一个非托管模型,然后是 中间表 多对多的加入也不会被取消 创建。然而,中介 一个托管和一个托管之间的表 将创建非托管模型

如果需要更改此默认值 行为,创造中介 表作为带有 根据需要设置托管集并使用 ManyToManyField.through属性为 让关系使用你的习惯 模型


因此,如果您想在管理中访问这两个模型中的ManyToMany,目前的官方解决方案是用于第二个模型。几天前我也有同样的问题/需要。如果你有很多条目,不能使用filter_水平小部件,等等,我对inlinemodel解决方案在DB查询中的使用不是很满意

我发现使用Django 1.2+和syncdb的解决方案是:

有关更多信息,请参阅票证


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

因此,如果您希望在管理中访问两个模型中的多个,当前的官方解决方案是用于第二个模型。几天前我也有同样的问题/需要。如果你有很多条目,不能使用filter_水平小部件,等等,我对inlinemodel解决方案在DB查询中的使用不是很满意

我发现使用Django 1.2+和syncdb的解决方案是:

有关更多信息,请参阅票证

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

让我在Django的ticket 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)
让我在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)

嗯,我使用的是Django 1.3.1,我遵循了你的例子,除了我的模型在不同的模块中,但我认为这不重要。不管怎样,当我做一些像userObj.groups这样的事情时,我会遇到一个错误,Django显然试图将User用作字符串,而不是找出它是一个对象。有什么想法吗?谢谢。没有看到你的代码,我不知道。正常情况下,它应该可以工作,但在Django 1.3中它仍然可以工作,没有测试1.3.1。问题可能是你的模型在不同的模块中,我不太记得当模型解析是字符串时它是如何工作的。你查过票了吗。有两种新的解决方案。最后一个和我的一样,但是非常干净简单。我使用的是Django 1.3.1,我遵循了您的示例,只是我的模型在不同的模块中,但我认为这不重要。不管怎样,当我做一些像userObj.groups这样的事情时,我会遇到一个错误,Django显然试图将User用作字符串,而不是找出它是一个对象。有什么想法吗?谢谢。没有看到你的代码,我不知道。正常情况下,它应该可以工作,但在Django 1.3中它仍然可以工作,没有测试1.3.1。问题可能是你的模型在不同的模块中,我不太记得当模型解析是字符串时它是如何工作的。你查过票了吗。有两种新的解决方案。最后一个和我的一样,但是非常干净简单。