1

在 django 我有三个模型:

  • 简单产品
  • ConfigurableProduct 用户将看到一个带有颜色等选项的产品,而不是显示 SimpleProducts 的几种变体。
  • GroupProduct - 几个一起销售的 SimpleProduct。

首先,我创建所有 SimpleProducts,然后我从几个产品的变体创建 ConfigurableProducts,这些产品是同一产品的变体,最后是 GroupProducts,它们是几个 SimpleProducts 的组合。

当用户导航到一个类别时,我需要向他展示所有三种类型。如果 SimpleProduct 是 ConfigurableProduct 的一部分,我不想显示两次。

如何进行查询?我必须创建三个查询吗?如何同时在三个模型上使用分页?我可以以某种方式使用继承吗?

谢谢

4

2 回答 2

0

如果不更清楚地了解您的业务逻辑,我认为这个问题很难回答。以下是我的假设:

  1. 可配置选项是临时性的,即您出售红色、蓝色和黄色的球,以及小、中、大号的衬衫等。这些选项没有办法抽象地表示,因为它们不超越类别。(如果他们这样做了,那么您的数据库设计就是错误的。如果所有内容都有自定义颜色选项,您只需在数据库表中将其设为一列。)
  2. 每个配置选项在您的公司都有一个预先存在的业务标识。有一些 sku 与红球或类似的东西有关。无论出于何种原因,每个可能的配置选项都必须有一个数据库行。(如果不是,那么你又做错了。)

如果是这种情况,我最简单的建议是拥有一些所有产品都继承自一个字段的基类:representative_product_id. 这个想法是,对于每个产品,都有一个代表版本显示在类别页面或目录中的任何其他位置。在您的数据库中,这将如下所示:

Name          id    representative_id
red_ball      1     1
blue_ball     2     1
green_ball    3     1
small_shirt   4     4
medium_shirt  5     4
large_shirt   6     4
unique_thing  7     7

至于 django 查询,F objects如果您有 1.1 或更高版本,我会使用。只是:

SimpleProduct.objects.filter(representative_id=F('id'))

这将返回一个查询集,其代表 id 与他们自己的 id 匹配。

此时,有人会叫嚣数据的完整性。主要条件是representative_id在所有情况下都必须指向与其representative_id匹配的对象id。有一些方法可以直接执行此操作,例如使用pre_save验证器或类似的东西。ProductType您也可以通过分解包含representative_id列的表来有效地做同样的事情。IE:

Products
Name          id    product_type
_________________________________
red_ball      1     ball
blue_ball     2     ball
green_ball    3     ball
small_shirt   4     shirt
medium_shirt  5     shirt
large_shirt   6     shirt
unique_thing  7     thing

Types
Name          representative_id
_______________________________
ball          1
shit          4
thing         7

这并不能取代使用某些验证器来强制执行完整性的需要,但它使它更加抽象。

于 2010-01-07T16:04:51.237 回答
-1

使用 Django 的多表继承,使用不会直接实例化的基类。基类仍然有一个可以运行查询的管理器,它将包含任何子类实例的基本属性。

为了解决您关于不得冗余显示的可配置产品的问题,我认为您有两种选择:

  • 使可配置产品成为 ConfigurableProductChoice 的多项选择(与 SimpleProduct 无关)。让 ConfigurableProductChoice 扩展 ConfigurableProduct。这样,您的结果中就会有一个 ConfigurableProduct 并且没有冗余。
  • 使可配置产品与各种选项相关联,并设计一个规则来根据选择的选项计算价格。一个简单的添加就可以了。您的产品 ID 需要对选择的选项进行编码。您仍然没有冗余,因为您没有涉及 SimpleProduct。
于 2010-01-07T14:11:05.243 回答