sql >> データベース >  >> RDS >> Mysql

Django3.0.3の移行APIを使用してModelStateおよびProjectStateを使用して移行できません

    まず、必要 モデルメタクラスを使用する 、すなわち。 ModelBase タイプではありません

    from django.db.models.base import ModelBase
    
    model_definition = ModelBase(
        model_item.table_name,
        bases,
        model_config
    )
    

    適切なメタクラスを使用したら 、 ModelBase である多くのクラス属性を使用しているため、無数のエラーが発生する可能性があります。 内部で設定し、自分で設定することを期待していません。

    モデルが持つすべての属性をダンプするのではなく、 ModelBaseの属性のみを設定する必要があります 以下を含む従来のモデルに設定されることを期待しています:

    • __ module __ および__ qualname __
    • モデルフィールド
    • カスタムマネージャーまたはクエリセット
    • モデルメソッド
    • モデルメタ

    それ以外はすべて省略してください。

    たとえば、このようなモデルがある場合は、モジュール myapp.models

    class Parent(models.Model):
        name = models.CharField(max_length=45)
    
    class Child(models.Model):
        name = models.CharField(max_length=45)
        parent = models.ForeignKey(Parent, on_delete=models.CASCADE)
    
    class ModelWithMeta(models.Model):
        class Meta:
            db_table = 'some_table'
    

    これらのモデルの動的バージョンは、次のようになっている必要があります。

    from django.db import models
    from django.db.models.base import ModelBase
    
    bases = (models.Model,)
    
    Parent = ModelBase('Parent', bases, {
        '__module__': 'myapp.models',
        '__qualname__': 'Parent',
        'name': models.CharField(max_length=45),
    })
    
    Child = ModelBase('Child', bases, {
        '__module__': 'myapp.models',
        '__qualname__': 'Child',
        'name': models.CharField(max_length=45),
        'parent': models.ForeignKey('myapp.Parent', on_delete=models.CASCADE),
    })
    
    ModelWithMeta = ModelBase('ModelWithMeta', bases, {
        '__module__': 'myapp.models',
        '__qualname__': 'ModelWithMeta',
        'Meta': type('Meta', (), {'db_table': 'some_table'}),
    })
    

    移行コードの目的がわからないため、動的モデルを機能させるためのハックであると想定します。つまり、コードを完全に破棄して、組み込みの移行ローダーを使用できます。つまり、

    python3 manage.py makemigrations myapp && python3 manage.py migrate myapp
    

    私はあなたがPythonに精通していない metaclasses 、コードを理解するための前提条件なので、それらを読むことをお勧めします。




    1. 事前定義された秒ごとにPHPページを更新します

    2. ORA-12704:文字セットの不一致

    3. リカバリが遅延したログ配布を使用したデータ損失の修正

    4. SQLでリレーションシップを作成する