2011-09-21 12 views
9

manage.py syncdb crea tabelle DB per i modelli nel modulo appname_modelname. Come posso fare manage.py per creare tabelle nel formato solo modelname?Django syncdb nome personalizzato per tabella

è l'unico modo è quello di aggiungere class Meta: db_table = u'modelname'

+0

Non sono sicuro, ma a sud potrebbe farlo. –

+0

Non si tratta di creare tavoli a sud, ma anche di django che li usano. Quindi sì e no. Ci sono sempre alcuni modi per superarlo, ma il modo sicuro e ben documentato è solo quello all'interno del django della vaniglia, per quanto ne so. – JackLeo

risposta

8

Sì, l'unico modo per cambiare il nome della tabella creata è quello di impostare db_table alla classe Meta interiore.

Vedere https://docs.djangoproject.com/en/dev/ref/models/options/#table-names.


Tuttavia, con alcune magie di metaclass, è effettivamente possibile fare ciò che si sta cercando. Questo esempio serve solo a dimostrare che è possibile dal momento che Python è un linguaggio così carino. Può rompere con le versioni più recenti (anche se improbabili) di Django poiché ModelBase e _meta non sono documentati ufficialmente AFAIK. Mi limiterei a aggiungere db_table manualmente nei tuoi modelli.

Creando una metaclasse personalizzata che costruisca le classi del modello, è possibile modificare l'attributo db_table nella meta class interna.

from django.db import models 
from django.db.models.base import ModelBase 

class ModelWithoutAppNameBase(ModelBase): 
    def __new__(cls, name, bases, attrs): 
     model = super(ModelWithoutAppNameBase, cls).__new__(cls, name, bases, attrs) 
     model._meta.db_table = name.lower() 
     return model 


class ModelWithoutAppName(models.Model): 
    __metaclass__ = ModelWithoutAppNameBase 

È quindi eredita dalla ModelWithoutAppName invece di django.db.models.Model quando si creano i modelli:

class YourModel(ModelWithoutAppName): # database table name will be yourmodel 
    foo = models.IntegerField() 
Problemi correlati