Фильтр Django ManyToMany с несколькими условиями

#django #manytomanyfield

#django #manytomanyfield

Вопрос:

Мои упрощенные модели следующие:

 class Function(models.Model):
    name = models.CharField(max_length=20)
    params = models.ManyToManyField("Param")

class Param(models.Model):
    name = models.CharField(max_length=20)
    value = models.CharField(max_length=20)
  

Итак, каждый объект функции имеет набор параметров, например:

 f = Function(name="my_function")
f.save()
param1 = Param(name="height", value="100")
param1.save()
param2 = Param(name="width", value="200")
param2.save()
f.params.add(param1)
f.params.add(param2)
  

Проблема в том, что я не могу понять, как выбрать функцию, используя фильтр по имени функции, имени параметра и значению параметра.

Для вышеуказанной функции выбор должен быть:

Получаем функцию с именем «my_function», которая содержит параметр с именем «height» и значением «100» И параметр с именем «width» и значением «200».

Заранее благодарю вас!

Ответ №1:

Это может сработать:

 from django.db.models import Q

functions = (Function.objects
    .filter(name='my_function')
    .filter(Q(params__name='height') amp; Q(params__value="100")
    .filter(Q(params__name="width") amp; Q(params__value="200"))
  

Комментарии:

1. Это работает! Я определял фильтр по параметрам как Q (params__name =’height’) amp; Q (params__value =»100″) Q (params__name =’width’) amp; Q (params__value =»200″), но это не сработало. Разделение Q объектов на два фильтра работает нормально. Спасибо!