Для запроса отношения "многие ко многим" в 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