Как сделать фильтр из моделей django, поля разные, значения схожие?
Начинаю изучать Django, для практики хочу реализовать уже существующий сайт агентства недвижимости используя Django.
Вопрос вот какой, есть несколько типов недвижимости: квартира, дом, земельный участок и т.п. понятно, что разные данные этих типов можно реализовать моделями. У квартиры может быть <этаж квартиры>/<общая этажность дома>, для дома и участка это не нужно, так же как и у дома может быть площадь участка, но у участка не может быть площади дома. К тому же участки принято мерять в сотках, а квартиры в квадратных метрах.
Цены у квартир фиксированные, а у новостроек есть разброс цен от и до, в зависимости от квартиры в новостройке.
Хотя правильнее сделать новостройку отдельной моделью, которая может в себе хранить ссылки на квартиры, которые относятся к этой новостройке. По факту же новостройку используют как объект недвижимости (модель в нашем случае), просто у нее 2 типа цен, минимальная и максимальная и не факт, что будет желание создавать для новостройки все доступные квартиры и привязывать их, вполне возможно такой логики и прийдется придерживаться далее. И искать соответственно нужно для новостройки (в последнем случае) по полю минимальной цены.
В общем, данные вроде схожие, но как искать в них общим поиском я пока понять не могу. Т.е. как например задать такой запрос фильтру: "У меня есть 15 000 000 р., что я могу на них купить", запрос по всем моделям должен выдать и новостройку с минимальной ценой не более 15000000 и дом и участок и, если есть, любой другой тип объекта. А если добавить к этому площадь уже сложнее, квартира и новостройка попадает в квадратные метры, дом тоже (сам дом), участок придомовой уже нет, участок как отдельный тип скорее всего не попадет, т.к. у него площадь в сотках (на фронте это можно обойти добавляя поля соответствующие выбранным типам объектов, но это может усложнить жизнь ищущему, а оно не желательно).
Для себя я бы разделял интерфейс по типу объекта, сложно себе представить человека, который не знает, что ищет на свои деньги, но и владельца текущего сайта понять можно, если так было сделано, значит кому то это нужно (это было в ТЗ). Но хранить все одной моделью и поля менять по ходу наполнения объекта данными (сейчас если выбран участок показываются свои различающиеся поля, если дом свои, общие поля остаются неизменными) – выглядит совсем не здраво.
Я не жду готового решения, просто интересно как подобные вещи принято решать в нормальных системах здравыми людьми. Часто ведь существуют разрозненные данные, разные названия полей в базе, разные модели, но наверняка существует способ отфильтровать нужное.
Elasticsearch? Django Q? С чего начать? Что почитать на тему? Есть ли существующие примеры?
Моё виденье.
Структуру можно сделать двух типов
1. Всё в одну модель, кроме списков(списки через связи ForeignKey/ManyToManyField/OneToOneField подгружать из других моделей или choices, они задаются администратором сайта и всегда статичны). Пускай даже будет 40 полей у модели.
2. Одна базовая, где общие данные. И куча типовых, относящихся связями к базовой модели, но имеющие свои уникальные поля. Списки так же как и в первом варианте, выносил в отдельные модели или choices.
Я бы выбрал второй вариант.
Поиск. Тут два варианта.
1. Сфинск или другие независимые поисковые программы работающие с джангой (Solr, Elasticsearch, Whoosh, Xapian).
2. Делать самой джангой и воевать за логику и ресурсы. То есть весь поиск прописывать руками, всю логику возможных вариантов.
Но я бы выбрал первый вариант, слишком много будет условий и по сути написание велосипеда. А второй вариант подходит под более "простой" тип поиска.
Т.е. как например задать такой запрос фильтру: "У меня есть 15 000 000 р., что я могу на них купить",
Нужно создать для каждого вида недвижимости отдельную модель, а такие запросы делать через последовательные запросы ко всем моделям через просто filter()
Результат обьединить в словарь