django mptt字段出现两次,破坏了SQL

django mptt字段出现两次,破坏了SQL,django,django-mptt,Django,Django Mptt,我正在使用django mptt来管理一个简单的CMS,其模型名为Page,如下所示(大部分可能不相关的字段被删除): 删除的字段称为附件,标题图像,导航覆盖,以及已发布 使用SQLite一切都很好,但当我使用MySQL并尝试使用admin(或使用ModelForms和save()方法)添加页面时,我得到了以下结果: ProgrammingError at /admin/mycms/page/add/ (1110, "Column 'level' specified twice") 其中生成的

我正在使用django mptt来管理一个简单的CMS,其模型名为
Page
,如下所示(大部分可能不相关的字段被删除):

删除的字段称为
附件
标题图像
导航覆盖
,以及
已发布

使用SQLite一切都很好,但当我使用MySQL并尝试使用admin(或使用ModelForms和
save()
方法)添加页面时,我得到了以下结果:

ProgrammingError at /admin/mycms/page/add/
(1110, "Column 'level' specified twice")
其中生成的SQL为:

'INSERT INTO `kaleo_page` (`title`, `slug`, `contents`, `nav_override`, `parent_id`,  
`published`, `headline_image_id`, `lft`, `rght`, `tree_id`, `level`, `lft`, `rght`,    
`tree_id`, `level`) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)'
出于某种原因,我得到了django mptt字段(
lft
rght
tree\u id
level
)两次。它在SQLite中工作可能是因为SQLite比MySQL更宽容它所接受的东西

获取所有字段名称()

>>> Page._meta.get_all_field_names()
['attachments', 'children', 'contents', 'headline_image', 'id', 'level', 'lft',
'nav_override', 'parent', 'published', 'rght', 'slug', 'title', 'tree_id']

这大概就是SQL不好的原因。我该怎么做才能使这些字段在
get\u all\u field\u names()
中出现两次?

我注意到您从多个基类继承,
类页(mptt.Model,BaseModel):
。在这两个模型上都可以找到重复的字段吗?

我注意到您继承了多个基类,
类页(mptt.Model,BaseModel):
。在这两个模型上都可以找到重复的字段吗?

因为您使用的是允许继承的,所以让我们假设继承mptt.Model与使用相同

运行
manage.py sqlall
时是否看到重复的字段?当我使用sqlite3或mysql运行它时,使用分支的\u mptt看起来还可以:

$ ./manage.py sqlall kaleo
BEGIN;
CREATE TABLE `kaleo_page` (
    [ ... ]
    `lft` integer UNSIGNED NOT NULL,
    `rght` integer UNSIGNED NOT NULL,
    `tree_id` integer UNSIGNED NOT NULL,
    `level` integer UNSIGNED NOT NULL
)
[ ... ]
如果输出看起来正常,那么PageAdmin呢?你在那里做什么花哨的事吗?如果是这样的话,您是否尝试过页面的普通模式管理员

# admin.py
from django.contrib import admin
from kaleo.models import Page

admin.site.register(Page)
因为您使用的是允许继承的,所以让我们假设继承mptt.Model与使用相同

运行
manage.py sqlall
时是否看到重复的字段?当我使用sqlite3或mysql运行它时,使用分支的\u mptt看起来还可以:

$ ./manage.py sqlall kaleo
BEGIN;
CREATE TABLE `kaleo_page` (
    [ ... ]
    `lft` integer UNSIGNED NOT NULL,
    `rght` integer UNSIGNED NOT NULL,
    `tree_id` integer UNSIGNED NOT NULL,
    `level` integer UNSIGNED NOT NULL
)
[ ... ]
如果输出看起来正常,那么PageAdmin呢?你在那里做什么花哨的事吗?如果是这样的话,您是否尝试过页面的普通模式管理员

# admin.py
from django.contrib import admin
from kaleo.models import Page

admin.site.register(Page)

问题似乎是字段被动态添加了两次(Ithink,因为
settings.py
被导入了两次

最后,我使用django mptt的常规版本修复了它,并将其添加到我的
\uuu init\uuuu.py

from cbc.kaleo.models import Page
import mptt

try:
    mptt.register(Page)
except mptt.AlreadyRegistered:
    pass

这不是世界上最漂亮的东西,但它可以工作!

问题似乎是字段被动态添加了两次(我认为是因为
设置.py
被导入了两次

最后,我使用django mptt的常规版本修复了它,并将其添加到我的
\uuu init\uuuu.py

from cbc.kaleo.models import Page
import mptt

try:
    mptt.register(Page)
except mptt.AlreadyRegistered:
    pass

这不是世界上最漂亮的东西,但它很有效!

Argh-对不起,我应该删除它。不。我在没有多重继承的情况下进行了测试,得到了相同的行为。这也是我的第一个猜测。Argh-对不起,应该删除它。不。我在没有多重继承的情况下进行了测试,得到了相同的行为。这也是我的第一个猜测。Sorry-我的问题的另一个例子不是很清楚-我正在使用Ben Firshman的django mptt()的fork,它使用继承而不是registeringThanks来获得您的帮助(和+1的努力!)sqlall的输出只显示一次字段,即使我只使用
admin.site.register(第页)
。还有其他想法吗?我想不出其他什么。我唯一要做的另一件事是在一个新的DB上尝试它,然后开始一次添加一个片段,直到问题被触发。这不是一个有趣或简单的下一步,但它应该可以帮助你找到问题的根源。也可以在一个新的项目中尝试你的kaleo应用程序,并将其作为唯一的应用程序--任何消除其他变量的方法都会有帮助。对不起,我的问题的另一个例子不是很清楚,我正在使用Ben Firshman的django mptt()的fork,它使用继承而不是registeringThanks来获得您的帮助(以及+1的帮助!)
sqlall
的输出只显示一次字段,即使我只使用
admin.site.register(第页),我仍然会得到错误
。还有其他想法吗?我想不出其他什么。我唯一要做的另一件事是在一个新的DB上尝试它,然后开始一次添加一个片段,直到问题被触发。这不是一个有趣或简单的下一步,但它应该可以帮助你找到问题的根源。也可以在一个新的项目中尝试你的kaleo应用程序,并将其作为唯一的应用程序--任何消除其他变量的方法都有帮助。