1

古い移行に、もはや定義されていないクラスまたはモジュールへの参照が含まれているという問題が発生しています。これらの問題を解決する最善の方法は何ですか?

これらの参照を削除するだけでエラー メッセージを取り除くことができますが、移行を中断するとどうなりますか?

また、Django 1.7 への移行が実際に私のコードベースの一部をインポートするのは少しおかしいと思うのは私だけでしょうか?

エラー メッセージの例:

Traceback (most recent call last):
  ...
  File "/.../migrations/0001_initial.py", line 194, in Migration
bases=(model_utils.models.UserPersonMixin, models.Model),
AttributeError: 'module' object has no attribute 'UserPersonMixin'

この場合、UserPersonMixin は、このモデルが継承していた抽象基本クラスですが、最近再編成中に破棄しました。

4

1 に答える 1

2

移行では、通常のように実際のモデルをインポートするのではなく、履歴モデルにアクセスする必要があります。

これは、あなたが抱えている問題に陥らないようにするために行われます。過去のモデル (つまり、そのような移行を作成したときに存在していたモデル) を取得するには、コードを置き換える必要があります。

公式のdjangoドキュメントからこれを確認してください(このケースはデータ移行用ですが、概念はケースに適用されます):

# -*- coding: utf-8 -*-
from django.db import models, migrations

def combine_names(apps, schema_editor):
    # We can't import the Person model directly as it may be a newer
    # version than this migration expects. We use the historical version.
    Person = apps.get_model("yourappname", "Person")
    for person in Person.objects.all():
        person.name = "%s %s" % (person.first_name, person.last_name)
        person.save()

class Migration(migrations.Migration):

    dependencies = [
        ('yourappname', '0001_initial'),
    ]

    operations = [
        migrations.RunPython(combine_names),
    ]

この移行は Python コードを実行し、特定のモデルが必要です。もう存在しないモデルをインポートすることを避けるために、直接インポートするのではなく、「その正確なタイム スライス」でモデルへの「集約された」アクセスを行います。このコード:

apps.get_model("yourappname", "Person")

次の正確な置き換えになります。

from yourappname.models import Person

後者は、移行を実行する必要がある真新しいインストールでは失敗するためです。

編集して、移行の完全なコードを投稿して、特定のケースでお手伝いできるかどうかを確認してください.

于 2014-09-24T16:42:25.117 に答える