如何根据常见的M2M属性进一步减少SearchQuerySet

时间:2012-01-24 00:05:16

标签: django django-haystack

如何根据常见的M2M属性进一步减少SearchQuerySet,以便查询sky = blue的所有对象?

分配ObjectA:

 Property → property_definition = "sky" value = "blue"
 Property → property_definition = "current_color" value = "red"

分配ObjectB:

 Property → property_definition = "sky" value = "red"
 Property → property_definition = "current_color" value = "blue"

这应该只产生一个答案(ObjectA),但我得到2,因为模板看到了两个属性。

任何人都可以了解如何缩小这些结果。因为SearchQuerySet不支持remove()我不能发布它们,我想不出一个干净的方法来做这个?

请帮助!!

--- models.py ---

DATA_CHOICES = ((u'string', u'string'), (u'integer', u'integer'),                (u'real', u'real'), (u'boolean', u'boolean'))


class PropertyDefinition(models.Model):
    name = models.CharField(unique=True, max_length=255)
    datatype = models.CharField(max_length=24, choices=DATA_CHOICES)

class Property(models.Model):
    property_definition = models.ForeignKey(PropertyDefinition)
    value = models.CharField(max_length=255)

class ObjectA(models.Model):
    properties = model.ManyToManyField(Property)
    name = models.CharField(unique=True, max_length=255)

class ObjectB(models.Model):
    properties = model.ManyToManyField(Property)
    name = models.CharField(unique=True, max_length=255)


--- search_indexes.py ---
class ObjectAIndex(indexes.BasicSearchIndex, indexes.Indexable):   
    text = indexes.CharField(document=True, use_template=True)
    name = indexes.CharField(model_attr='name')

    def get_model(self):
        return ObjectA

class ObjectBIndex(ObjectAIndex):
    def get_model(self):        
        return ObjectB


--templates (identical but named appropriately )--

{{object.name}}
{% for property in object.properties %}
    {{ property.property_definition.name }} {{ property.value }}
{% endfor %}

非常感谢!!

2 个答案:

答案 0 :(得分:1)

首先,为什么不


class Property(models.Model):
    name = models.CharField(unique=True, max_length=255)
    value = models.CharField(max_length=255)
    datatype = models.CharField(max_length=24, choices=DATA_CHOICES)

然后,假设上述模型:


ObjectA.objects.filter(properties__name='sky', properties__value='blue')

第三,您的对象模型不允许您在同一查询集中获取这两种类型的对象。我会将ObjectAObjectB合并到同一个模型中。

答案 1 :(得分:0)

这样的事情应该起作用

a = ObjectA.properties.filter(name = Your_name)
b = a.property_definition.filter(value = Your_Value)

可能与上述不完全相同,但一般的想法是你想将它们链接到togethor并向下钻取以获得你想要的每个链。