Django ORM Доступ к связанным объектам «многие ко многим» через набор запросов - PullRequest
0 голосов
/ 20 февраля 2019

В моем приложении Django у меня есть следующие две модели для событий, которым можно присвоить произвольное количество тегов.

class Tag(models.Model):
  # ...

class Event(models.Model):
  # ...

  tags = models.ManyToManyField("Tag")

У меня также есть страница, где пользователь должен иметь возможность выбрать числотегов, а затем просмотреть все события, связанные с этим тегом.Имея список идентификаторов тегов, могу ли я использовать ORM Django для получения списка (отдельных) событий, связанных хотя бы с одним из указанных тегов?

Если нет, я также попытался добиться этого с помощью следующего необработанногоSQL

event.objects.raw("""
  SELECT *
  FROM   app_name_event_tags t
  WHERE  t.tag_id IN %s
""", selected_tag_ids)

С этим связаны две проблемы:

1) Возвращенные события не будут различаться

2) Мой синтаксис для заполнителя списка selected_tag_idsневерно

Ответы [ 2 ]

0 голосов
/ 20 февраля 2019

, чтобы получить связанные события, возможно, самый простой способ:

list_of_tags = Tags.objects.filter(your condition)
events = Event.objects.filter(tags__in=list_of_tags).distinct()
0 голосов
/ 20 февраля 2019

Если у вас есть список Tag идентификаторов, вы можете получить связанные события, выполнив

Events.objects.filter(tags__id__in=selected_tag_ids).distinct()

, где selected_tag_ids - это итерация целых чисел (pks для Tag объектов))

Дополнительные примеры из Django docs;

>>> Article.objects.filter(publications__id=1)
<QuerySet [<Article: Django lets you build Web apps easily>, <Article: NASA uses Python>]>

>>> Article.objects.filter(publications__title__startswith="Science")
<QuerySet [<Article: NASA uses Python>, <Article: NASA uses Python>]>

>>> Article.objects.filter(publications__title__startswith="Science").distinct()
<QuerySet [<Article: NASA uses Python>]>

Прочитайте мою статью «Многие ко многим» здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...