Django ORM通过queryset访问相关的多对多对象

时间:2019-02-19 21:46:21

标签: python sql django orm

在我的Django应用中,我具有以下两种事件模型,可以给它们分配任意数量的标签。

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

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

  tags = models.ManyToManyField("Tag")

我还有一个页面,用户可以在其中选择许多标签,然后查看与该标签相关的所有事件。给定一个标签ID列表,我可以使用Django ORM来获取与至少一个给定标签相关联的(独特)事件的列表吗?

如果没有,我也尝试使用以下原始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 :(得分:1)

如果您有ptr个ID的列表,则可以通过执行以下操作获取相关事件

Tag

Events.objects.filter(tags__id__in=selected_tag_ids).distinct() 是整数的可迭代项(selected_tag_ids对象的pks)

Django文档中的其他示例;

Tag

在多对多here上阅读我的照片

答案 1 :(得分:1)

获取相关事件的最简单方法可能是:

list_of_tags = Tags.objects.filter(your condition)
events = Event.objects.filter(tags__in=list_of_tags).distinct()