Django-Migrationen ignorieren db_table, wenn sie mithilfe der Metaklasse festgelegt werdenPython

Python-Programme
Anonymous
 Django-Migrationen ignorieren db_table, wenn sie mithilfe der Metaklasse festgelegt werden

Post by Anonymous »

Ich verwende eine Metaklasse, um die Namen meiner Django-Modell-Datenbanktabellen automatisch von der Kamel-Schreibweise auf durch „_“ getrennte Namen festzulegen, z. B. MyGreatModel hat einen Tabellennamen wie appname_my_great_model anstelle des standardmäßigen appname_mygreatmodel:

Code: Select all

class PrettyModelBase(ModelBase):

def __new__(cls, name, bases, attrs):
super_new = ModelBase.__new__(cls, name, bases, attrs)
module_name = camel_to_underscore(name)
model_module = sys.modules[cls.__module__]

app_label = super_new.__module__.split('.')[-2]
db_table = '%s_%s' % (app_label, module_name)
if not getattr(super_new._meta, 'proxy', False):
super_new._meta.db_table = db_table

return super_new

class BaseModel(models.Model):

__metaclass__ = PrettyModelBase

class Meta:
abstract = True

class MyGreatModel(BaseModel):
somefield = models.TextField(default="")
Migrationen scheinen diesen db_table-Namen jedoch nicht zu übernehmen. Wenn ich makemigrations ausführe, zeigt CreateModel db_table nicht in den Optionen für dieses Modell an. Wenn ich es in der Klasse Meta von MyGreatModel fest codiere, dann ist es so. Wenn ich außerdem die SQL überprüfe, die mit python manage.py sqlmigrate... ausgeführt werden soll, wird angezeigt, dass die Tabelle appname_mygreatmodel erstellt wird, nicht der durch Trennzeichen getrennte Tabellenname.

Wenn ich jedoch diese Migration ausführe und dann das Modell in der Django-Shell untersuche, dann zeigt MyGreatModel._meta.db_table my_great_model an, wie ich es von meinem erwarten würde Metaklasse. Wenn ich das db_table-Attribut manuell zu den 0001-Init-Migrationsoptionen für CreateModel hinzufüge, ist auch für nachfolgende Migrationen alles in Ordnung, aber Django sollte das meiner Meinung nach automatisch tun...

Warum greift Django-Migrationen die db_table hier nicht auf?

Ich verwende Django==1.10.5.

Danke für jede Hilfe

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post