Как удалить префикс таблицы для модели Django?

Я создаю новое приложение Django (не проект) под названием "Бизнес", затем добавляю следующий класс в 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)

Если я использую бизнес напрямую, Django получит доступ к таблице "bussications_bussications" в базе данных, которой, очевидно, не существует.

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

Ответ 1

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

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

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

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

Ответ 3

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

Например, следующий код FOO_ всеми таблицами 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 ):
    ...