Для запроса отношения "многие ко многим" в django должен совпадать хотя бы один элемент списка и не все элементы списка

Здесь у меня есть список мест и теги для резервирования :

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

вот мое решение :

tags = Tag.objects.filter(name__in=tags)
print("tags", tags)
places = PartnerPlace.objects.filter(zip_code__in=cps)
print("places", places)
#slots is a queryset
slots = Slot.objects.filter()
for place in places:
    for tag in tags:
        slots = slots | Slot.objects.filter(
            tag=tag,
            place=place,
        )

Это работает, но я думаю, что это не элегантно и не оптимально, если у кого-то есть лучшее решение.

Приветствует

Если я правильно понимаю, вам нужны все Slots, где zip_code ИЛИ tag_name переходят в ваш запрос.

slots = Slot.objects.filter(Q(tag__name__in=tags) | Q(place__zip_code__in=cps))

Я конкатенирую Q объект в .filter вместо конкатенации результатов.

Подробнее о Q здесь: https://docs.djangoproject.com/en/5.0/topics/db/queries/#complex-lookups-with-q-objects

Вернуться на верх