Есть две сущности:
Первая заказывает услугу, вторая услугу оказывает (Заказчик - Исполнитель).
Так же у нас есть так называемые "фичи". Например: выезд на дом, бесплатное консультация, бесплатное первое обращение, приоритетная тех. поддержка.
Заказчик, создавая заявку на исполнение может указать, какие "фичи" его интересуют. Например, только приоритетная тех. поддержка и выезд на дом.
Исполнитель же в своем профиле указывает, какие доп. "фичи" у него есть. Например, он в интересах только выезжать на дом и все.
Нужно сформулировать один запрос (Django ORM), который работал бы так:
1) Заказчику интересен лишь только выезд на дом, а у исполнителя есть куча других "фич", но выезд на дом тоже есть. Значит эту заявку на исполнение он должен видеть.
2) Заказчику интересен выезд на дом и приоритетная тех. поддержка, однако сервис в интересах только вызжать на дом и все, приоритетную тех. поддержку не оказывает. Значит, эту заявку на исполнение он не видит, а видит ее те, кто поддерживает среди прочих "фич" и те, что запросил пользователь.
3) Заказчика не интересуют никакие доп. фичи - эту заявку видят все.
Что мы имеем:
class Feature(models.Model):
AVAILABLE_FEATURES = (
('free_diagnostics', 'Бесплатная консультация'),
('call_home', 'Возможна консультация на дому')
)
feature = models.CharField(max_length=32, choices=AVAILABLE_FEATURES, unique=True)
class Executor(models.Model): # Исполнитель
# ...
features = models.ManyToManyField(Feature, blank=True, related_name='executors')
class ClientOrder(models.Model): # Заказчик
# ...
features = models.ManyToManyField(ServiceFeature, blank=True, related_name='client_orders', verbose_name='Доп. услуги')
def orders_list(request):
# ...
# Наша попытка. Дублирует записи, и не отвечает критериям, которые я описал выше.
orders_l = orders_l.filter(features__in=executor_obj.features.all())
# ...