1

我有一个第三方 Django 应用程序(Satchmo),它有一个模型Product,我在我的 Django 站点中广泛使用。

我想添加通过颜色搜索产品的功能。所以我创建了一个名为ProductColor. 这个模型大概是这样的……

class ProductColor(models.Model):
    products = models.ManyToManyField(Product)
    r = models.IntegerField() 
    g = models.IntegerField()
    b = models.IntegerField()
    name = models.CharField(max_length=32)

当商店产品的数据加载到站点中时,产品的颜色数据用于创建一个ProductColor指向该对象的对象Product。计划是允许用户通过搜索颜色范围来搜索产品。

我似乎无法弄清楚如何将此查询放入 QuerySet。我可以做这个...

# If the color ranges look something like this...
r_range, g_range, b_range = ((3,130),(0,255),(0,255))

# Then my query looks like
colors_in_range = ProductColor.objects.select_related('products')
if r_range:
    colors_in_range = colors_in_range.filter(
        Q(r__gte=r_range[0])
        | Q(r__lte=r_range[1])
    )
if g_range:
    colors_in_range = colors_in_range.filter(
        Q(g__gte=g_range[0])
        | Q(g__lte=g_range[1])
    )
if b_range:
    colors_in_range = colors_in_range.filter(
        Q(b__gte=b_range[0])
        | Q(b__lte=b_range[1])
    )

所以我最终得到了一个 QuerySet,其中包含ProductColor该颜色范围内的所有对象。Product然后我可以通过访问products每个属性的 ManyToMany 属性来构建一个 s 列表ProductColor

我真正需要的是一个有效的 QuerySet Product。这是因为将对这些结果执行其他逻辑,并且需要对QuerySet对象进行操作。

所以我的问题是如何构建我真正想要的 QuerySet?如果做不到这一点,是否有一种有效的方法来重新构建 QuerySet(最好不要再次访问数据库)?

4

2 回答 2

1

您可以使用范围字段查找:

您可以在任何可以在 SQL 中使用 BETWEEN 的地方使用范围——用于日期、数字甚至字符。

您的查询:

r_range, g_range, b_range = ((3,130),(0,255),(0,255))

products = Product.objects.filter(productcolor_set__r__range=r_range, 
    productcolor_set__g__range=g_range,
    productcolor_set__b__range=b_range).distinct()
于 2011-03-25T00:09:50.783 回答
1

如果要获取Product查询集,则必须过滤Product对象并通过产品颜色的反向关系进行过滤:

products = Product.objects.filter(productcolor_set__r__gte=x).distinct()

于 2011-03-25T00:00:31.587 回答