在django中同时查询和分页三种类型的模型

时间:2010-01-07 13:58:46

标签: django pagination django-queryset

在django我有三种模式:

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

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

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

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

由于

2 个答案:

答案 0 :(得分:0)

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

  1. 可配置选项是临时的,即您销售红色,蓝色和黄色的球,小型,中型和大型等等。没有办法抽象地表示这些选项,因为它们不会超越类别。 (如果他们这样做了,你的数据库设计都是错误的。如果所有内容都有自定义颜色选项,你只需在数据库表中创建一个列。)
  2. 每个配置选项都在您的公司拥有预先存在的业务标识。有一些sku与红球或类似的东西相关联。无论出于何种原因,每个可能的配置选项都必须有一个数据库行。 (如果不是,那么,你做错了。)
  3. 如果是这种情况,我最简单的建议是让所有产品都使用字段继承一些基类: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,使用基类,你不会直接实例化。基类仍然有一个可以运行查询的管理器,它将包含任何子类实例的基本属性。

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

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