Когда использовать абстрактную модель? - PullRequest
1 голос
/ 08 ноября 2019

На нашем веб-сайте есть форма, в которой вы можете указать стоимость, если вы вводите адреса от и до. Оттуда вы можете продолжить бронирование и просто покинуть сайт. Мы сохраняем сгенерированные пользователями котировки для статистических целей (например, сравниваем расценки и соотношение бронирований). В настоящее время я использую две таблицы для этого. Цитата и бронирование. Вот таблицы (модели в Django):

Quotation:
    to
    from
    price
    some_charge
    other_charge


Booking:
   to
   from
   price
   some_charge
   other_charge
   name
   # other booking details

Я сохранил их как отдельные модели, но заметил, что со временем они становятся очень похожими. Я добавляю поля к обеим моделям, а также имею дублирующие методы. Должен ли я сделать QuotationModel и расширить оба от этого? Любые другие предложения? Любая теория, я должен для сценария, как это?

1 Ответ

0 голосов
/ 08 ноября 2019

У вас есть две опции, и разница между ними заключается в создании таблиц в БД:

1. Чтобы создать «абстрактный базовый класс» из этих двух классов

Предоставляя мета-опцию abstract=True в классе Model, вы можете создать абстрактный базовый класс Models.

class AbstractModel(models.Model):
    to = ...
    from = ...
    price = ...
    some_charge = ...
    other_charge = ...

    class Meta:
        abstract = True

class Quotation(AbstractModel):
    pass

class Booking(AbstractModel):
    name = ...

Абстрактные базовые классы не создают таблицы в вашей базе данных. Вы можете просто наследовать этот класс как любые обычные классы Python. Поэтому вы можете создать два класса Quotation и Booking, которые наследуют AbstractModel.

Если у вас есть возможность добавить больше классов в будущем, я рекомендую этот метод, потому что он более расширяемый.

2. Наследовать напрямую

Код проще, но вы должны знать, что если какой-то класс наследует другой класс, который не является абстрактным базовым классом, то будут созданы таблицы для обоих классов. в вашей базе данных.

class Quotation(models.Model):
    to = ...
    from = ...
    price = ...
    some_charge = ...
    other_charge = ...

class Booking(Quotation):
    name = ...

Но, как вы видите, это жестко запрограммировано, поэтому убедитесь, что эта структура наследования будет использоваться только один раз.

И вы можете обратиться к официальномудокумент Джанго. https://docs.djangoproject.com/en/2.1/topics/db/models/#model-inheritance

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