【发布时间】:2025-12-06 21:45:02
【问题描述】:
我有一个问题想解决一天。
模型
class Quote(models.Model):
text = models.TextField()
source = models.ForeignKey(Source)
tags = models.ManyToManyField(Tag)
...
class Source(models.Model):
title = models.CharField(max_length=100)
...
class Tag(models.Model):
name = models.CharField(max_length=30,unique=True)
slug = models.SlugField(max_length=40,unique=True)
...
我正在尝试为引号世界建模。有关系:一个Source 有很多Quotes,一个Quote 有很多Tags。
问题是:
- 如何获取包含在
Source中的所有Tags(通过包含的Quotes)? - 尽可能少的查询。
- 它们包含在该来源中的次数
我用模型方法尝试过与预取无关的简单方法
def source_tags(self):
tags = Tag.objects.filter(quote__source__id=self.id).distinct().annotate(usage_count=Count('quote'))
return sorted(tags, key=lambda tag:-tag.usage_count)
在模板中:
{% for tag in source.source_tags|slice:":5" %}
source.quote
{% endfor %}
现在我有
sources = Source.objects.all().prefetch_related('quote_set__tags')
在模板中,我不知道如何正确迭代以获取一个来源的 Tags,以及如何计算它们而不是列出重复的标签。
【问题讨论】:
标签: django django-orm