django modelが変更されたら、データベースを同期させます.
5856 ワード
djangoを使って開発するには、様々なニーズに応じてmodelを変更する必要があります.この時、python manager.py syncdbは使いにくくなりました.
今はいいツールがあります.southです.これはmodelを変えるためのものです.公式文書をご覧くださいhttp://south.readthedocs.org/en/latest/index.html. 中には詳細な文書があります.インストールと使用が含まれています.
インストールが簡単ですinstallでいいです
そしてあなたのsettings.pyの中のap_installに'south'を追加します.
そしてコマンドpython manage.py schemamigrationを使うことができます. app--initialこれはあなたがmodelを変更する前に作った初期化です.このバージョンがあったら、あなたは自由にappの中のmodelを変更できます.変更が完了したら、python manage.py schemamigrationを実行します. アプリ --autは次にpython manage.py migrate apを使ってください.
problems:
1です.フィールドを追加すると、southはこのフィールドにデフォルトの直接値を追加して、以前に既に存在していたレコードをデフォルトの値にする必要があります.しかし、このフィールドがuniqueなら、どのようにデフォルト値を設定してもだめです.この場合は、データベースのテーブルを直接操作して、既存のレコードをすべて削除して、デフォルトの値を設定する必要があります.もう一つの方法は、まずuniqueを設定せずにフィールドを追加し、サイトのバックグラウンドを通じて既存のレコードのこのフィールドを異なる値に変更してからuniqueに設定することです.後者は私の考えで、実践したことがなくて、1種の構想を提供します.
2です.いくつかのフィールドに自分の解析ルールを追加する必要があります.一部のcustomフィールドはCanot freeze fieldなので、自分でルールを書く必要があります.
例えば、クラス:core.fields.thumbs.pyのクラス ImageWithThumbs Field
今はいいツールがあります.southです.これはmodelを変えるためのものです.公式文書をご覧くださいhttp://south.readthedocs.org/en/latest/index.html. 中には詳細な文書があります.インストールと使用が含まれています.
インストールが簡単ですinstallでいいです
そしてあなたのsettings.pyの中のap_installに'south'を追加します.
そしてコマンドpython manage.py schemamigrationを使うことができます. app--initialこれはあなたがmodelを変更する前に作った初期化です.このバージョンがあったら、あなたは自由にappの中のmodelを変更できます.変更が完了したら、python manage.py schemamigrationを実行します. アプリ --autは次にpython manage.py migrate apを使ってください.
problems:
1です.フィールドを追加すると、southはこのフィールドにデフォルトの直接値を追加して、以前に既に存在していたレコードをデフォルトの値にする必要があります.しかし、このフィールドがuniqueなら、どのようにデフォルト値を設定してもだめです.この場合は、データベースのテーブルを直接操作して、既存のレコードをすべて削除して、デフォルトの値を設定する必要があります.もう一つの方法は、まずuniqueを設定せずにフィールドを追加し、サイトのバックグラウンドを通じて既存のレコードのこのフィールドを異なる値に変更してからuniqueに設定することです.後者は私の考えで、実践したことがなくて、1種の構想を提供します.
2です.いくつかのフィールドに自分の解析ルールを追加する必要があります.一部のcustomフィールドはCanot freeze fieldなので、自分でルールを書く必要があります.
例えば、クラス:core.fields.thumbs.pyのクラス ImageWithThumbs Field
from django.db.models import ImageField
class ImageWithThumbsField(ImageField):
def __init__(self, verbose_name=None, name=None, width_field=None, height_field=None, sizes=None, **kwargs): self.verbose_name=verbose_name self.name=name self.width_field=width_field self.height_field=height_field self.sizes = sizes super(ImageField, self).__init__(**kwargs)
core.models.py , core.models.py :
from south.modelsinspector import add_introspection_rules from core.fields.thumbs import ImageWithThumbsField add_introspection_rules( [ ( (ImageWithThumbsField, ), [], { "verbose_name": ["verbose_name", {"default": None}], "name": ["name", {"default": None}], "width_field": ["width_field", {"default": None}], "height_field": ["height_field", {"default": None}], "sizes": ["sizes", {"default": None}], }, ), ], ["^core.fields.ImageWithThumbsField",])
。 rule, :
http://south.readthedocs.org/en/latest/customfields.html#extending-intropection
http://stackoverflow.com/questions/4715964/django-south-introspection-rule-doesnt-work
3 っているなら./manage.py migrate myapp , (
django-south-table-already-exists
)があります.
./manage.py migrate myapp --fake
schemamigration 。
:
http://stackoverflow.com/questions/3090648/django-south-table-already-exists
http://stackoverflow.com/questions/10769644/django-south-adding-new-field-but-databaseerror-occurs-table-already-exists
, 。
model , 。 。