Django - рассматривая объект «многие ко многим» как один объект во время фильтрации - PullRequest
3 голосов
/ 17 мая 2011

Скажем, у меня есть три модели - Персона, Еда, Аромат.

Персона и Аромат разделяют отношения многих ко многим (человеку может нравиться много вкусов).отношение «многие ко многим» (пища может иметь много вкусов).

Для любого конкретного человека я хотел бы вернуть все продукты, у которых есть набор вкусов, который является подмножеством вкусов этого человека.

Например,

personA.flavor.all () -> ['пряный', 'сладкий', 'горький']
foodA.flavor.all () -> ['spicy', 'sweet']
foodB.flavor.all () -> ['spicy,' bitter ']
foodC.flavor.all () -> [' bitter ',' greasy ']

Я бы хотел использовать фильтр Django для объектов Food.objects, чтобы он возвращал QuerySet, содержащий foodA и foodB.

Я понимаю, что могу добиться аналогичного результата, если я преобразую вкусы пользователя в набор и вызову issperset в каждом из ароматов пищи (и добавляю такую ​​пищу в заранее определенный список), но яМне интересно (и надеюсь), есть ли более изящное решение, включающее функцию фильтра модели django, что-то, что вернет мне QuerySet вместо списка.

Заранее большое спасибо за вашу помощь.

1 Ответ

1 голос
/ 17 мая 2011

Я не думаю, что вы можете достичь того, чего хотите, просто используя форму Джанго.Каким-то образом потребовалось бы генерировать SQL, способный проверить, является ли набор результатов надмножеством другого набора результатов.Это было бы возможно (в sql), если бы вы могли повернуть набор результатов.В SQL Server есть операторы PIVOT и UNPIVOT, которые могут это делать (другие пакеты СУБД, вероятно, имеют аналогичные операторы), но django не способен генерировать такой SQL.Я сомневаюсь, что ОРМ общего назначения был бы способен на это.

Решение, о котором вы уже знаете, уже достаточно элегантно.Два запроса достаточно, чтобы получить все необходимые данные, и тогда язык общего назначения может намного легче определить членство в наборе.Делать так в SQL было бы немного кошмаром (я думаю).

Хороший вопрос.Я начал писать SQL для достижения результата, пока не понял, что это будет гораздо больше проблем, чем у меня есть время без оплаты (и, вероятно, выход из моей глубины!).Было бы очень интересно увидеть чистое решение sql, если бы кто-нибудь опубликовал его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...