sql >> Database teknologi >  >> RDS >> Mysql

Kan ikke migrere ved hjælp af ModelState og ProjectState ved hjælp af migrations API i Django 3.0.3

For at starte skal du bruge at bruge model-metaklassen , dvs. ModelBase kode> , og ikke type :

from django.db.models.base import ModelBase

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

Når du har brugt den rigtige metaklasse , vil du sandsynligvis modtage et utal af fejl, da du bruger mange klasseattributter, der ModelBase indstiller internt og forventer ikke, at du skal indstille dig selv.

I stedet for at dumpe alle de attributter, som din model har, bør du kun indstille de attributter, der ModelBase forventer at blive sat på en traditionel model, som omfatter:

  • __modul__ og __qualname__
  • modelfelter
  • tilpassede administratorer eller forespørgselssæt
  • modelmetoder
  • model Meta

Alt andet bør udelades.

Så hvis du for eksempel har en model, der ser sådan ud, i modulet 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'

Den dynamiske version af disse modeller skal se sådan ud:

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

Jeg forstår ikke formålet med din migreringskode, så jeg vil antage, at det var et hack i forsøget på at få de dynamiske modeller til at fungere, hvilket betyder, at du sandsynligvis kan smide den helt ud og bruge den indbyggede migrationsindlæser, dvs.:

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

Jeg er ikke bekendt med python metaklasser , jeg vil anbefale at læse op på dem, da det er en forudsætning for at forstå min kode.




  1. Bedste måde at håndtere samtidighedsproblemer

  2. oprette et tilfældigt tal ved hjælp af MYSQL

  3. MySQL Workbench Alternatives - ClusterControl Configuration Management

  4. Oprettelse af et multidimensionelt array ud fra forespørgsel