sql >> Database >  >> RDS >> Mysql

Kan niet migreren met ModelState en ProjectState met behulp van de migratie-API in Django 3.0.3

Om te beginnen heb je nodig om de model metaclass te gebruiken , dwz. ModelBase , en niet type :

from django.db.models.base import ModelBase

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

Zodra u de juiste metaclass gebruikt, , zult u waarschijnlijk een groot aantal fouten ontvangen, aangezien u veel klassekenmerken gebruikt die ModelBase wordt intern ingesteld en verwacht niet dat u uzelf instelt.

In plaats van alle kenmerken die uw model heeft te dumpen, moet u alleen de kenmerken instellen die ModelBase verwacht te worden ingesteld op een traditioneel model, waaronder:

  • __module__ en __qualname__
  • modelvelden
  • aangepaste managers of querysets
  • modelmethoden
  • model Meta

Al het andere moet worden weggelaten.

Dus als je bijvoorbeeld een model hebt dat er zo uitziet, in de module 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'

De dynamische versie van deze modellen moet er als volgt uitzien:

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

Ik begrijp het doel van je migratiecode niet, dus ik ga ervan uit dat het een hack was in een poging om de dynamische modellen werkend te krijgen, wat betekent dat je het waarschijnlijk helemaal kunt weggooien en de ingebouwde migratielader kunt gebruiken, dat wil zeggen:

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

Ik ben niet bekend met python metaclasses , raad ik aan om er meer over te lezen, omdat het een vereiste is om mijn code te begrijpen.




  1. MySQL-viewdefiner-machtigingen en fout 1356

  2. Hoe krijg ik de MySQL-tabelstructuur in PHP? Plus een lijst van alle tafels?

  3. Belangrijkste functies om naar te zoeken in een SQL Server Monitoring Tool

  4. Python gebruiken om toegang te krijgen tot SQL met een variabele kolomnaam