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)
Вернуться на верх