0

我正在使用 django-mptt 来管理一个简单的 CMS,其模型名为Page,看起来像这样(最可能不相关的字段被删除):

class Page(mptt.Model, BaseModel):
  title    = models.CharField(max_length = 20)
  slug     = AutoSlugField(populate_from = 'title')
  contents = models.TextField()
  parent   = models.ForeignKey('self', null=True, blank=True, 
         related_name='children', help_text = u'The page this page lives under.')

删除的字段称为attachments, headline_image, nav_override, 和published

使用 SQLite 一切正常,但是当我使用 MySQL 并尝试使用管理员(或使用 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和)两次。它在 SQLite 中工作大概是因为 SQLite 比 MySQL 更宽容地接受它。tree_idlevel

get_all_field_names()还显示了两次:

>>> 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_all_field_names()

4

3 回答 3

1

我注意到您从多个基类继承,class Page(mptt.Model, BaseModel):. 是否在这两个模型上都找到了重复的字段?

于 2010-04-28T17:58:48.923 回答
1

由于您使用的是允许继承的 mptt 分支,因此假设继承 mptt.Model 与使用mptt.register()相同。

# Page and TrunkPage are basically the same
class Page(branched_mptt.Models, BaseModel):
    # ...

class TrunkPage(BaseModel):
    # ...
trunk_mptt.register(TrunkPage, order_insertion_by=['title'])

运行时是否看到重复字段manage.py sqlall?当我用 sqlite3 或 mysql 运行它时,使用 branched_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 呢?你在那里做什么花哨的事吗?如果是这样,您是否尝试过使用普通的 Page 模型管理员?

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

admin.site.register(Page)
于 2010-04-28T19:33:31.647 回答
1

问题似乎是这些字段被动态添加了两次(我认为是因为这种方式settings.py被导入了两次。

我最终通过使用 django-mptt 的常规版本来修复它,并将其添加到我的__init__.py

from cbc.kaleo.models import Page
import mptt

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

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

于 2010-05-09T18:19:32.657 回答