代码之家  ›  专栏  ›  技术社区  ›  Dominic Rodger

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

  •  0
  • Dominic Rodger  · 技术社区  · 14 年前

    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并尝试使用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)'
    

    lft , rght , tree_id level

    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不好的原因。我该怎么做才能使这些字段在中出现两次呢 ?

    3 回复  |  直到 14 年前
        1
  •  1
  •   T. Stone    14 年前

    class Page(mptt.Model, BaseModel): . 在这两个模型上是否都找到了要复制的字段?

        2
  •  1
  •   istruble kalyan    14 年前

    因为你用的是 branch of mptt 为了允许继承,假设继承mptt.Model与使用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运行它时,使用分支的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
    )
    [ ... ]
    

    # admin.py
    from django.contrib import admin
    from kaleo.models import Page
    
    admin.site.register(Page)
    
        3
  •  1
  •   Dominic Rodger    14 年前

    问题似乎是字段被动态添加了两次(I 认为 因为路的缘故 settings.py 两次导入。

    __init__.py

    from cbc.kaleo.models import Page
    import mptt
    
    try:
        mptt.register(Page)
    except mptt.AlreadyRegistered:
        pass
    

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