Джанго syncdb пользовательское имя для таблицы - PullRequest
9 голосов
/ 21 сентября 2011

manage.py syncdb создает таблицы базы данных для моделей в форме appname_modelname. Как я могу сделать manage.py для создания таблиц в формате modelname?

единственный способ добавить class Meta: db_table = u'modelname'

1 Ответ

8 голосов
/ 21 сентября 2011

Да, единственный способ изменить имя созданной таблицы - установить для db_table внутренний метакласс.

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


Однако, с некоторой магией метаклассов, на самом деле можно делать то, что вы ищете. Этот пример просто показывает, что это возможно, так как Python - хороший язык. Это может порвать с более новыми выпусками (даже маловероятными) Django, так как ModelBase и _meta официально не документированы AFAIK. Я бы просто добавил добавление db_table вручную в ваши модели.

Создавая собственный метакласс, который создает классы модели, можно изменить атрибут db_table во внутреннем метаклассе.

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

Затем вы наследуете от ModelWithoutAppName вместо django.db.models.Model при создании моделей:

class YourModel(ModelWithoutAppName):  # database table name will be yourmodel
   foo = models.IntegerField()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...