Как дополнительно уменьшить SearchQuerySet на основе общего атрибута M2M - PullRequest
0 голосов
/ 24 января 2012

Как дополнительно уменьшить SearchQuerySet на основе общего атрибута M2M, чтобы я мог запрашивать все объекты, где небо = синий?

Назначить 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 ]

1 голос
/ 24 января 2012

сначала, почему бы не


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 в одну модель.

0 голосов
/ 24 января 2012

как то так должно работать

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

Может быть, не совсем так, как описано выше, но общая идея заключается в том, что вы хотите связать их вместе, чтобы получить то, что вы хотите в каждой цепочке.

...