Answer the question
In order to leave comments, you need to log in
How to AND filter based on M2M relationship in Django?
There is an application with the following models:
class Code(models.Model):
zip = models.CharField(unique=True)
# ...
class Item(models.Model):
code = models.ManyToManyField(Code)
# ...
for item in Item.objects.filter(...):
zips = []
for code in item.code.all():
zips.append(code.zip)
print zips
# Здесь zips должны содержать 1,2,3,4
Item.objects.filter(code__zip__in=[1,2,3,4])
qs.filter(reduce(lambda x, y: x & y, [m.models.Q(code__zip=z) for z in [1,2,3,4]]))
Answer the question
In order to leave comments, you need to log in
Не уверен в правильности, но может быть, попробовать вот так?
По идее, это даст эффект операции AND.
Если не сработает, существует ещё одно решение. Если не против, разобьём его составление на шаги, мне самому так проще писать.
1. Делаем запрос на промежуточной таблице отношения ManyToMany, которая связывает Item и Code, выбирая те пары Item - Code, для которых item__zip входит в нужное множество.
2. В результирующем запросе значения item_id будут повторяться. Нам нужно найти те значения, для которых число строк равняется четырём.
from django.db.models import Count
qs = qs.values('item_id').annotate(count=Count('id')).order_by().filter(count=4)
Didn't find what you were looking for?
Ask your questionAsk a Question
731 491 924 answers to any question