Атрибуты модели (продукта), используемые в товаре, оповещении, предопределенном поиске ... это правильно с концепцией СУХОЙ? - PullRequest
0 голосов
/ 05 сентября 2011

Прежде всего я хотел бы отметить, что я не опытный программист.

Скажем, есть модель Product, и есть несколько типов продуктов с разными атрибутами (ну, например, 2 типа).

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

Class BaseProduct(models.Model):
    name = models.CharField()
    type = models.CharField()
    creation_date = models.DateField()
    creation_ip = models.IpAddressfield()

class ProductTypeX(BaseProduct):
    attribute_1 = models.ForeignKey(some_other_model)
    attribute_2 = models.ForeignKey(some_other_model2)

class ProductTypeY(BaseProduct):
    attribute_1 = models.ForeignKey(some_other_model)
    attribute_2 = models.ForeignKey(some_other_model2)

Существует возможность создания оповещения по электронной почте о создании нового продукта на основе некоторых критериев, а также «быстрый предопределенный поиск» на основе некоторых критериев. Для них я создал (снова ...) модели.

class BaseAlert(models.Model):
    name = models.CharField()
    email = models.BooleanField()
    sms = models.BooleanField()

ProductTypeXAlert(BaseAlert):
    attribute_1 = models.ForeignKey(some_other_model)
    attribute_2 = models.ForeignKey(some_other_model2)

ProductTypeYAlert(BaseAlert):
    attribute_1 = models.ForeignKey(some_other_model1)
    attribute_2 = models.ForeignKey(some_other_model2)

class BasePredefinedSearch(models.Model):
    name = models.CharField()

ProductTypeXPredefinedSearch(BasePredefinedSearch):
    attribute_1 = models.ForeignKey(some_other_model1)

Это правильное решение или я должен создать какую-то универсальную модель атрибутов для оповещения, предопределенный поиск ?? .. Я повторяю здесь поля атрибутов много раз. Что вы думаете об этом?

Спасибо

1 Ответ

1 голос
/ 05 сентября 2011

Я бы сделал абстрактную модель AttributesBase и использовал бы множественное наследование:

class AttributesBase(models.Model):
    class Meta:
        abstract = True

    attribute1 = models.ForeignKey(SomeOtherModel1)
    attribute2 = models.ForeignKey(SomeOtherModel2)


class ProductTypeX(BaseProduct, AttributesBase):
    """Defines product type X"""

Надеюсь, что это поможет вам.

...