Как убрать префикс таблицы для модели Django? - PullRequest
15 голосов
/ 24 марта 2012

Я создаю новое приложение django (не проект) под названием Bussications, затем добавляю следующий класс в models.py.

class Bussinesses(models.Model):
    business_email = models.EmailField()
    password = models.CharField(max_length=20)
    contact_first_name = models.CharField(max_length=30)
    contact_last_name = models.CharField(max_length=30)

, если я использую Bussprises непосредственно, django получит доступ к таблице "bussications_bussINESS"в базе данных, он, очевидно, не существует.

Поскольку таблица "бизнес" также используется другим приложением, поэтому не может его переименовать.Я хочу знать, как использовать модель Djano без префикса таблицы, и я не хочу напрямую использовать API необработанной базы данных.

Большое спасибо.

Ответы [ 4 ]

38 голосов
/ 24 марта 2012

Просто используйте мета-опции модели .

class Bussinesses(models.Model):
    business_email = models.EmailField()
    password = models.CharField(max_length=20)
    contact_first_name = models.CharField(max_length=30)
    contact_last_name = models.CharField(max_length=30)

    class Meta:
        db_table = "bussinesses"

BTW предприятия с ошибками.Так как вы указываете имя таблицы, вам не нужно присваивать вашей модели то же имя, что и у таблицы, поэтому, если имя таблицы написано с ошибкой и вы не можете ее легко исправить, вы можете, по крайней мере, изменить имяваш класс для правильного написания предприятий .Я бы тоже избавился от плюрализма и сделал бы его class Business.Наконец, при использовании Django или Rails в существующей базе данных нередко бывает необходимо задать пользовательское имя таблицы для каждой таблицы.

2 голосов
/ 24 марта 2012

Вы можете указать имя таблицы в метаклассе модели, используя свойство db_table.

Кроме того, если вы используете таблицу базы данных, которая уже существует, вы также можете взглянуть на свойство managed. После установки неуправляемой модели syncdb не повлияет на нее (например, если вы сбросите настройки своего приложения), но вы все равно сможете использовать ORM в Django.

1 голос
/ 19 ноября 2018

Кроме того, если вы хотите изменить (или удалить) префикс для всех таблиц, вы можете предоставить свой собственный метакласс.Это полезно, если у вас есть несколько случаев, например Businesses, где вы просто хотите, чтобы имя класса и таблицы были одинаковыми.

Например, следующий код ставит перед всеми таблицами префикс FOO_ вместо appname_:

class MyModelBase( ModelBase ):
    def __new__( cls, name, bases, attrs, **kwargs ):
        if name != "MyModel":
            class MetaB:
                db_table = "FOO_" + name

            attrs["Meta"] = MetaB

        r = super().__new__( cls, name, bases, attrs, **kwargs )
        return r       

class MyModel( Model, metaclass = MyModelBase ):
    class Meta:
        abstract = True

class Businesses( MyModel ):
    ...
1 голос
/ 24 марта 2012

вы можете установить имя таблицы вручную, используя мета-класс, подробнее здесь: https://docs.djangoproject.com/en/dev/ref/models/options/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...