0

私は django-mptt を使用して、Page次のようなモデルを持つ単純な CMS を管理しています (おそらく無関係なフィールドは削除されています)。

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.')

削除されたフィールドはattachmentsheadline_imagenav_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)'

何らかの理由で、django-mptt フィールド ( lftrghttree_idおよびlevel) を 2 回取得しています。おそらく、SQLite は MySQL よりも許容範囲が広いため、SQLite で動作します。

get_all_field_names()また、それらを2回示します。

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

おそらくこれが、SQLが悪い理由です。これらのフィールドが に 2 回表示されるようにするにはどうすればよいでしょうget_all_field_names()か?

4

3 に答える 3

1

問題は、フィールドが動的に2回追加されていることであるように見えました(方法が2回インポートされているためだと思います。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 に答える
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 に答える