Django:模型名称冲突

4 投票
1 回答
7216 浏览
提问于 2025-04-15 12:28

我正在我的项目中尝试使用不同的开源应用程序。问题是,有两个不同的应用程序使用了相同的模型名称,并且它们各自的模型定义也不同。

我尝试使用:

    class Meta:
        db_table = "db_name"

但是没有成功。我在同步数据库时仍然遇到字段名称冲突的错误。有没有什么建议?

更新

其实我是在尝试将 Satchmo 和 Pinax 集成在一起。错误信息是:

错误:一个或多个模型没有通过验证:

contact.contact:字段 'user' 的访问器与相关的多对多字段 'User.contact_set' 冲突。请在 'user' 的定义中添加一个 related_name 参数。

friends.contact:多对多字段 'users' 的访问器与相关字段 'User.contact_set' 冲突。请在 'users' 的定义中添加一个 related_name 参数。

你说得对,表名已经是唯一的。我分析了一下模型,发现模型 'Contact' 在两个不同应用程序的两个模型中都有。当我注释掉其中一个模型时,程序就正常工作了。

可能错误的原因是这两个应用程序都在 PYTHON_PATH 中,当另一个应用程序定义了相同名称的模型时,就会发生冲突。

1 个回答

6

问题在于,Satchmo和Pinax都有一个联系模型(Contact model),这个模型里面有一个指向用户(User)的外键(ForeignKey)。Django会试图为每个外键在用户模型中添加一个叫“contact_set”的反向关系属性,这就导致了冲突。

解决办法是在Pinax的联系模型的外键中添加类似于related_name="pinax_contact_set"的参数,Satchmo的联系模型也是类似的。这就需要直接修改其中一个的源代码。你也许可以通过一种叫做猴子补丁(monkeypatching)的方法来实现,但我觉得这会比较复杂。

撰写回答