Django сложный запрос с полем "многие ко многим
Давайте объясним суть проблемы. Я пытаюсь отфильтровать все Person
, которые имеют определенные атрибуты.
Вот мои модели:
class Person(models.Model):
community = models.ForeignKey(
Community, on_delete=models.CASCADE, related_name="people"
)
class Attribute(models.Model):
community = models.ForeignKey(
Community, on_delete=models.CASCADE, related_name="attributes"
)
name = models.CharField(max_length=50)
value = models.CharField(max_length=100)
class Trait(models.Model):
person = models.ForeignKey(
Person, on_delete=models.CASCADE, related_name="person_attributes"
)
attribute = models.ForeignKey(
Attribute, on_delete=models.CASCADE, related_name="traits"
)
Человек может обладать следующими качествами:
Attribute(name='head', value='big')
Attribute(name='head', value='small')
Attribute(name='head', value='medium')
Attribute(name='hands', value='white')
Attribute(name='hands', value='red')
#...
Эти атрибуты связаны с Person
через сущность Trait
.
Теперь у меня есть следующий дикт, который я использую для динамического построения запроса:
{
"head": ["small", "medium"],
"hands": ["white", "red"],
}
Я хочу отфильтровать все Person
, которые имеют атрибут "голова" со значением "маленькая" или "средняя" и "руки" "белые" или "красные"
Вот что я сделал до сих пор, но это не работает:
# value is the dict like the one explained above from which
# I will obtain the elements for filtering
def routine(self, value):
query = Q()
for attr, traits in value.items():
if len(traits) > 0:
query &= Q(
Q(person_attributes__attribute__name=attr) &
Q(person_attributes__attribute__value__in=traits)
)
return Person.objects.filter(query)