@blohinn

Как правильно фильтровать записи (Django ORM) с ManyToMany отношением?

Есть две сущности:

Первая заказывает услугу, вторая услугу оказывает (Заказчик - Исполнитель).

Так же у нас есть так называемые "фичи". Например: выезд на дом, бесплатное консультация, бесплатное первое обращение, приоритетная тех. поддержка.

Заказчик, создавая заявку на исполнение может указать, какие "фичи" его интересуют. Например, только приоритетная тех. поддержка и выезд на дом.

Исполнитель же в своем профиле указывает, какие доп. "фичи" у него есть. Например, он в интересах только выезжать на дом и все.

Нужно сформулировать один запрос (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())
    # ...
  • Вопрос задан
  • 125 просмотров
Пригласить эксперта
Ответы на вопрос 1
@olexndr090
У меня та же проблема, при использовании in в filter, дублируются записи.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы