【问题标题】:Django dynamic filterDjango 动态过滤器
【发布时间】:2015-11-15 01:26:43
【问题描述】:

我有一个产品:

class Product(models.Model):
    ...

本产品的特点,带fk到动态属性:

class ProductFeatures(models.Model):
    product = models.ForeignKey('Product')
    features_category = models.ForeignKey('FeaturesCategory')
    value = models.ForeignKey('Features')

动态属性名称模型:

class FeaturesCategory(models.Model):
    title = models.CharField(max_length=255, verbose_name=_(u'Название'))

每个属性的值:

class Features(models.Model):
    category = models.ForeignKey('FeaturesCategory')
    value = models.CharField(max_length=255, verbose_name=_(u'Значение'))

所有这些工作的示例:

我们创建了 FeaturesCategory 对象 - “Color”,为其添加了一些值:“Red”、“Green”、“Blue”。并添加了另一个 FeaturesCategory 对象 - “Count”,其值为:“1”、“2”、“3”

我们添加到产品中的所有这些,例如:

颜色 - 红色 计数 - 3

麻烦,请问如何过滤这个产品?

for param in self.request.GET:
            if not param in ['pangination', 'view', 'order', 'page']:
                name, value = param.split('_')
                filters.append(
                    Q(productfeatures__features_category__title=name,
                      productfeatures__features_category__features__value=value)
                )

如果我们有两个“参数”来过滤它就不起作用

【问题讨论】:

  • 您对request.GET 的期望值是什么?
  • 我不确定您使用的是Q 对。尝试不使用productfeatures__features_category__title=name, productfeatures__features_category__features__value=value
  • 我的问题是我生成这样的查询:filter(Q(attr='Color', value='Red'), Q(attr='Count', value='5')) 如果我选择了两个过滤器...

标签: sql django orm


【解决方案1】:

你应该像这样动态地构建你的 Q 类型:

 qlist = []
 for fi in filters:
        if len(fi) == 2:
            fi = fi.split('_')
            qlist.append(Q((fi[0],fi[1])))
    if qlist:
        YourModel.objects.filter(reduce(operator.and_, qlist))

【讨论】:

  • 我的问题是我生成这样的查询:filter(Q(attr='Color', value='Red'), Q(attr='Count', value='5')) 如果我选择了两个过滤器...当然它不会选择具有 attr 'color' 和 'count' 的产品
猜你喜欢
  • 2016-05-30
  • 2011-08-11
  • 1970-01-01
  • 1970-01-01
  • 2016-01-20
  • 1970-01-01
  • 2021-12-15
  • 1970-01-01
  • 2012-01-24
相关资源
最近更新 更多