2011-09-21 21 views
9

manage.py syncdb crea tablas db para los modelos en el formulario appname_modelname. ¿Cómo puedo hacer que manage.py cree tablas en el formato solo modelname?Django syncdb nombre personalizado para la tabla

es la única forma es añadir class Meta: db_table = u'modelname'

+0

No estoy seguro, pero al sur puede hacer eso. –

+0

No se trata de crear tablas en el sur, sino también de utilizar django. Entonces sí y no Siempre hay algunas maneras de superarlo, pero la manera segura y bien documentada es solo aquella dentro de Vanjan Django hasta donde yo sé. – JackLeo

Respuesta

8

Sí, la única manera de cambiar el nombre de la tabla creada es establecer db_table a la clase Meta interior.

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


Sin embargo, con algo de magia de metaclass, es posible hacer lo que estás buscando. Este ejemplo es solo para mostrar que es posible ya que Python es un lenguaje tan agradable. Puede romperse con las versiones más recientes (aunque poco probables) de Django, ya que ModelBase y _meta no están documentados oficialmente AFAIK. Me limitaría a agregar db_table manualmente en sus modelos.

Al crear una metaclase personalizada que construye las clases de modelo, es posible cambiar el atributo db_table en la metaclase 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 

A continuación, hereda de ModelWithoutAppName en lugar de django.db.models.Model al crear sus modelos:

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