【问题标题】:Django ORM Accessing related many-to-many objects through querysetDjango ORM 通过查询集访问相关的多对多对象
【发布时间】:2019-02-19 21:46:21
【问题描述】:

在我的 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 占位符的语法不正确

【问题讨论】:

    标签: python sql django orm


    【解决方案1】:

    如果你有Tag的ID列表,那么你可以通过做得到相关的事件

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

    其中selected_tag_ids 是整数的可迭代对象(Tag 对象的pks)

    来自 Django 文档的更多示例;

    >>> 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>]>
    

    阅读我的多对多here

    【讨论】:

    • 非常感谢!这真的很有帮助!
    【解决方案2】:

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

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

    【讨论】:

    • 非常感谢!我也会接受你的回答,但看起来我只能做一个。
    猜你喜欢
    • 2013-05-19
    • 2011-10-09
    • 2014-05-27
    • 1970-01-01
    • 2012-04-30
    • 2015-03-07
    • 2020-06-16
    • 2016-10-16
    • 1970-01-01
    相关资源
    最近更新 更多