sql >> Databáze >  >> RDS >> Mysql

Nelze migrovat pomocí ModelState a ProjectState pomocí rozhraní API pro migraci v Django 3.0.3

Chcete-li začít, potřebujete používat metatřídu modelu , tj. kód> , a nikoli typ :

from django.db.models.base import ModelBase

model_definition = ModelBase(
    model_item.table_name,
    bases,
    model_config
)

Jakmile použijete správnou metatřídu , pravděpodobně obdržíte nesčetné množství chyb, protože používáte mnoho atributů třídy, které ModelBase nastavuje interně a neočekává, že se nastavíte sami.

Namísto vyprázdnění všech atributů, které má váš model, byste měli nastavit pouze atributy, které ModelBase očekává, že bude nastaven na tradiční model, který zahrnuje:

  • __modul__ a __qualname__
  • pole modelu
  • vlastní správci nebo sady dotazů
  • modelové metody
  • model Meta

Vše ostatní by mělo být vynecháno.

Pokud tedy máte například modely, které vypadají takto, v modulu 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'

Dynamická verze těchto modelů musí vypadat takto:

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'}),
})

Nerozumím účelu vašeho migračního kódu, takže budu předpokládat, že to byl hack ve snaze zprovoznit dynamické modely, což znamená, že jej pravděpodobně můžete úplně vyhodit a použít vestavěný zavaděč migrace, tj.:

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

Neznáte python metaclasses , doporučoval bych si je přečíst, protože je to nezbytný předpoklad pro pochopení mého kódu.




  1. Dotaz MySQL, 3 tabulky, t1-t2 a poté aktualizace t3. Jak to mohu udělat nejúčinnějším způsobem?

  2. Jak posílat C++ a mysql dynamické mysql dotazy

  3. ER_NOT_SUPPORTED_AUTH_MODE:Klient nepodporuje ověřovací protokol požadovaný serverem; zvážit upgrade klienta MySQL

  4. Data jsou příliš dlouhá pro sloupec v Django na MySQL