0

我想知道如何对我的 Products 模型进行建模以根据产品的变体部分自动创建(并且管理应用程序也会理解它)产品的变体。

我的产品有;

  • 颜色
  • 尺寸

并且将来可能会获得更多功能。

我将如何为我的产品类建模以生成产品的所有变体?

假设我会在 ColorsRed Blue Green和 Sizes中创建一个新产品XS S M L XL

class Product(models.Model):
    name = models.CharField(max_length=200)

class Color(models.Model):
    product = models.ForeignKey(Product)
    name = models.CharField(max_length=200)

class Size(models.Model):
    product = models.ForeignKey(Product)
    name = models.CharField(max_length=200)

class FutureVariant(models.Model):
    product = models.ForeignKey(Product)
    name = models.CharField(max_length=200)

# etc.

现在,当我需要一种智能方法时,我会为该产品自动创建所有颜色尺寸-[FUTURE VARIANT]。

所以我会告诉 Django;

  • 创建新产品
    • 在颜色Red Blue Green
    • 在尺寸XS S M L XL

Product 类将生成 Products_product 表中所有可能组合的产品。

我几乎可以肯定这有设计缺陷。但我只是好奇如何将这个逻辑放在 ORM 中,而不是编写奇怪的过程代码,这可能违反 DRY 原则。

在数据库逻辑中,我会想到这样的事情;

PRODUCTS
- id
- name

PRODUCTS_VARIANTS_COLORS
- id
- name
- html_code

PRODUCTS_VARIANTS_SIZES
- id
- name

PRODUCTS_VARIANTS_TABLES
- table_name
- table_id

PRODUCTS_VARIANTS
- product_id
- variant_table
- variant_id

这样我就可以制作无穷无尽的变体表,只要我将它们注册到我的PRODUCTS_VARIANTS_TABLES并将它们的名称存储为相关。PRODUCTS_VARIANTS将包含产品的所有变体,包括它们的组合。我还打算有一个选择阶段,用户可以在其中选择(在 HTML 复选框列表中)它想要和不想要的变体。

问题(我认为)是这并不真正符合 ORM 中的逻辑。

4

2 回答 2

2

我不知道您是在询问替代品还是只是想让自己的方式发挥作用,但是将产品与其属性分开呢?

因此,您只需一个模型,而不是为属性创建单独的Attribute模型。通过这种方式,您可以对数据库进行面向未来的验证,以便您可以轻松添加更多属性(例如,如果您的产品具有高度和宽度,而不仅仅是颜色或尺寸)。

class AttributeBase(models.Model):
    label = models.CharField(max_length=255) # e.g. color, size, shape, etc.
    ...

class Attribute(models.Model):
    base = models.ForeignKey('AttributeBase', related_name='attributes')
    value = models.CharField(max_length=255) # e.g. red, L, round, etc.
    internal_value = models.CharField(max_length=255, null=True, blank=True) # other values you may need e.g. #ff0000, etc.
    ...

class ProductAttribute(Attribute):
    product = models.ForeignKey('Product', related_name='attributes')

现在为产品创建所有属性变得非常容易......

class Product(models.Model):
    ...

    def add_all_attributes(self):
        for attribute in Attribute.objects.all():
            self.attributes.add(attribute)

现在,当您使用product.add_all_attributes()该产品时,将包含所有属性。你甚至可以让它添加某个属性AttributeBase

def add_all_attributes_for_base(self, label):
    base = AttributeBase.objects.get(label=label)
    for attribute in base.attributes.all():
        self.attributes.add(attribute)
于 2013-05-12T22:48:27.543 回答
1

你可以这样写:

class Product(models.Model):

    @classmethod
    def create_variants(cls):
        # compute all possible combinations
        combinations = ...
        for combination in combinations:
            Product.objects.create(**combination)

创建所有组合确实会通过注册可能的变体及其可能的值来实现。

请注意,ORM 可以帮助您将 Django 对象映射到数据库记录,它不能帮助您生成要保存的数据库记录(阅读:Django 模型)。

于 2013-05-12T20:20:00.060 回答