在django我有三种模式:
首先我创建了所有的SimpleProducts,然后我从几个产品创建了ConfigurableProducts,这些产品是同一产品的变体,而最后一个GroupProducts是几个SimpleProducts的组合。
当用户导航到某个类别时,我需要向他展示所有这三种类型。如果SimpleProduct是ConfigurableProduct的一部分,我不想再显示它。
如何进行查询?我是否必须创建三个查询? 如何在三个模型上同时使用分页? 我可以以某种方式使用继承吗?
由于
答案 0 :(得分:0)
我认为如果不更清楚地了解您的业务逻辑,这个问题很难回答。以下是我的假设:
如果是这种情况,我最简单的建议是让所有产品都使用字段继承一些基类: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查询,如果你有1.1或更高版本,我会使用F objects
。只是:
SimpleProduct.objects.filter(representative_id=F('id'))
这将返回一个查询集,其代表ID与其自己的ID匹配。
此时,有人会要求数据完整性。主要条件是representative_id
必须在所有情况下指向representative_id
与其id
匹配的对象。有一些方法可以直接强制执行此操作,例如使用pre_save
验证程序或类似的东西。您也可以通过分解包含ProductType
列的representative_id
表来有效地做同样的事情。即:
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
这并不能取代使用某些验证器强制执行完整性的需要,但它会使它更抽象。
答案 1 :(得分:-1)
使用Django的multi-table inheritance,使用基类,你不会直接实例化。基类仍然有一个可以运行查询的管理器,它将包含任何子类实例的基本属性。
要解决有关不得冗余显示的可配置产品的问题,我认为您有两种选择: