如何根据常见的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 %}
非常感谢!!
答案 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')
第三,您的对象模型不允许您在同一查询集中获取这两种类型的对象。我会将ObjectA
和ObjectB
合并到同一个模型中。
答案 1 :(得分:0)
这样的事情应该起作用
a = ObjectA.properties.filter(name = Your_name)
b = a.property_definition.filter(value = Your_Value)
可能与上述不完全相同,但一般的想法是你想将它们链接到togethor并向下钻取以获得你想要的每个链。