Django の以前のコメントシステムからの移行

revision-up-to:17812 (1.4)

Django の以前のバージョンには、もう撤廃された、ドキュメント化されていない コメントシステムがありました。このフレームワークをリバースエンジニアリング して使っていたユーザは、新たなコメントシステムに移行する必要があります。 このガイドでは、コメントシステムの移行方法を解説しています。

まず、新旧のコメントシステムの違いを示します:

  • 新しいシステムにはドキュメントがあります。
  • 新しいシステムは、 formsmodelforms のような新しく Django に 登場した機能を使っています。
  • コメントモデルは以前は FreeCommentComment モデルに分かれ ていましたが、 Comment に統合されました。
  • コメントに “email” および “URL” フィールドが追加されました。
  • レーティング (rating)、写真 (photo)、カルマ (karma) といった機能がな くなりました。これらは World Online でしか使っていなかったからです。
  • {% comment_form %} タグがなくなりました。その代り、新たなコメント のポストに使うフォームを返す {% get_comment_form %} と、 comments/form.html テンプレートを使ってフォームをレンダする {% render_comment_form %} の二つのタグが追加されました。
  • URLconf へのインクルード方法が変わりました。次のように書いていたところを:

    (r'^comments/', include('django.contrib.comments.urls.comments')),
    

    次のように書き換えてください:

    (r'^comments/', include('django.contrib.comments.urls')),
    

データの移行

コメントシステムのデータモデルは、新しいモデルで変更され、テーブルの名前も 変わりました。既存のデータを新たなコメントシステムに移す前に、 クイックスタートガイド に従って新たな コメントシステムをインストールし、適切なテーブルを生成しておいてください。

データを新たなコメントシステムに移行するには、以下のような SQL を直接実行し てください:

BEGIN;

INSERT INTO django_comments
    (content_type_id, object_pk, site_id, user_name, user_email, user_url,
    comment, submit_date, ip_address, is_public, is_removed)
SELECT
    content_type_id, object_id, site_id, person_name, '', '', comment,
    submit_date, ip_address, is_public, not approved
FROM comments_freecomment;

INSERT INTO django_comments
    (content_type_id, object_pk, site_id, user_id, user_name, user_email,
    user_url, comment, submit_date, ip_address, is_public, is_removed)
SELECT
    content_type_id, object_id, site_id, user_id, '', '', '', comment,
    submit_date, ip_address, is_public, is_removed
FROM comments_comment;

UPDATE django_comments SET user_name = (
    SELECT username FROM auth_user
    WHERE django_comments.user_id = auth_user.id
) WHERE django_comments.user_id is not NULL;
UPDATE django_comments SET user_email = (
    SELECT email FROM auth_user
    WHERE django_comments.user_id = auth_user.id
) WHERE django_comments.user_id is not NULL;

COMMIT;