【问题标题】:How to query in django one to many如何在django中一对多查询
【发布时间】:2018-03-26 19:57:23
【问题描述】:

我想做什么?

我有一个应用程序有三个模型:SeriesSectionEpisode,每个都有一个一对多查询(通过 ForeignKey)。就这样

series-> many Section,section-> 许多情节

现在我将在系列页面中显示一个包含剧集信息的部分,但它会产生更多查询。

现在代码

views.py

series  = Series.objects.get(id=series_id)
section = Section.objects.filter(series=series)

list.html

{% for item in sections %}
...

{% for episode in item.episode_set.all %}
...
{% endfor %}

...
{%endfor%}

models.py

class Section(models.Model):
    series = models.ForeignKey(Series)
     ....
class Episode(models.Model):
    section = models.ForeignKey(Section)

我想得到什么?

一个示例代码告诉我如何在 views.py 中进行查询,并且只使用很少的查询。

你可以猜到,在我的代码中,如果这里有很多节和很多集,就会有很多查询。

一些想法。

我之前使用 Laravel,在 Laravel 中,它有一个 hasMany 函数,我可以用它来获取其他模型项(由 belongsTo 定义)。 Django 有同样的功能吗?

【问题讨论】:

  • 您当前的views.py 运行了吗?您是否有模板,如果有,您使用什么调用将数据发送到该模板?
  • @ben 我使用渲染将数据发送到模板,但我认为这不是关键问题。关键问题是在关系模型中获取数据。

标签: python mysql django django-models django-templates


【解决方案1】:

如果在模板中你只需要剧集,你可以用单个查询来查询它们

Episode.objects.filter(section__series=series_id)

但如果您需要所有数据,则可以使用 prefetch_related Django docs

最简单的例子对你的代码来说已经足够了

series = Series.objects.filter(id=series_id).prefetch_related('section_set', 'section_set__episode_set').get()

在此之后对series.section_set.all()section.episode_set.all() 的调用将不会产生额外的查询。

【讨论】:

  • 是的,这就是我想要的。也许我应该学习如何使用 prefetch_related
  • 毫无疑问,它是提高查询速度的强大工具。并查看Prefetch 对象,您可以传递它而不是带有字段名称的字符串以获得更大的灵活性(例如,仅获取满足某些条件的相关实例)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-11-22
  • 2011-11-13
  • 2021-12-22
  • 2022-06-12
  • 1970-01-01
  • 2017-02-02
  • 1970-01-01
相关资源
最近更新 更多