2015-03-17 5 views
1

Вот моя модель Vendor.Django - запрос фильтра возвращает неверный запрос

class Vendor(models.Model): 
    cluster = models.ManyToManyField(Cluster) 
    name = models.CharField(_("vendor name"),max_length=30) 
    phone = models.IntegerField(_("vendor phone no."),max_length=10) 
    address = models.CharField(_("vendor address"),max_length=70) 
    objects = VendorManager() 

def __str__(self): 
    return self.name 

cluster является ManyToManyField от Vendor модели Cluster, которая заключается в следующем -

class Cluster(models.Model): 
    clusterName = models.CharField(_("Locality name"),max_length=70) 

Теперь, я бегу следующие queries-

Vendor.objects.values('id','cluster').all() 

Это дает результат - [{'cluster': 3, 'id': 2}, {'cluster': 3, 'id': 3}, {'cluster': 4, 'id': 3}]

Очевидно, что поставщики с идентификатором 3 связан с двумя кластерами с идентификаторами 3 и 4 и поставщика с идентификатором 2 связан с кластером с идентификатором 2.

На беге,

Vendor.objects.values('id','cluster').filter(cluster=3)` 

Я ожидал вернуться [{'cluster': 3, 'id': 2}, {'cluster': 3, 'id': 3}]

Однако, он возвращает

[{'cluster': 3, 'id': 2}, {'cluster': 3, 'id': 3}, {'cluster': 4, 'id': 3}]. 

Я не уверен, но это происходит, вероятно, потому, что .filter() находит V endor id, которые соответствуют идентификатору кластера 3, а затем возвращают все QuerySets, соответствующие этому конкретному идентификатору поставщика.

Однако я хочу, чтобы он возвращал только те запросы, которые сопоставляются только с этим идентификатором кластера.

+1

попробуйте поместить 'filter' пункт перед' п values' – Anentropic

+1

работал как шарм. Пожалуйста, отправьте это как ответ, чтобы я мог его принять. :-) – Deathstroke

ответ

1

попытаться поставить условие filter до пункта values

Я не 100% уверен, почему ... странно документы говорят, это не имеет значения:
https://docs.djangoproject.com/en/1.7/ref/models/querysets/#django.db.models.query.QuerySet.values

Люди, которые Django предпочитает сначала применять все методы, влияющие на SQL, а затем (необязательно) с помощью любых методов, влияющих на выход (например, values ​​()), но это не имеет большого значения. Это ваш шанс действительно выставлять напоказ свой индивидуализм.

Я думаю, что ваше предположение относительно того, почему может быть правильным

Смежные вопросы