在Django中,如何在标签过滤的出版物列表中显示与出版物相关的所有标签?

rlcwz9us  于 2022-11-18  发布在  Go
关注(0)|答案(2)|浏览(149)

考虑以下型号:

第一个
好的,当我们找到一个模板,并创建一个for循环来创建每个出版物的表示并显示相应的标签时,Django会为每个出版物调用一个数据库来获取该出版物的所有标签,这意味着:
tag.publications的迭代x-〉检查哪些标签与publication X匹配。
当然,我们可以不显示标签,一切都会像魔术一样工作(利用prefetch_related),但这不是我们想要的:)

我们怎么能在Django做类似的事情?

我们需要的是某种优化的方式来实现这样的结果,因为stackoverflow渲染15个项目的速度非常快,这让我觉得他们不会像Django默认的那样做。
This is what html might look like
This is what html code might look like
另外,我的问题听起来不太像。但以防万一有人会说:“哦,这是一个糟糕的设计,你根本不应该这样做”我决定举一个例子。

sbdsn5lh

sbdsn5lh1#

您可以在Publication模型中添加一个属性,将tags呈现为字符串列表,因此:

class Publication(models.Model):
    text = models.TextField()
    tags = models.ManyToManyField(Tag)

    @property
    def tags_list(self):
        # renders as ["django", "python", ...]
        return list(self.tags.values_list("name", flat=True))

确保使用prefetch_related("tags")优化查询。

更新I:

为了适合您的视图代码,您将使用prefetch_related作为:

from .models import Tag, Publication
from django.shortcuts import get_object_or_404, render

def publications_tagged(request, name):
    tag = get_object_or_404(Tag.objects.prefetch_related('publications', 'publications__tags'), name=name)
    return render(request, 'myapp/tagged_questions.html', {'tag': tag})

更新II:

您可以在这里阅读更多关于prefetch_related的信息。

e4yzc0pl

e4yzc0pl2#

答案很简单,您只需在prefetch_related中指定publications__tags,即可得到:

tag = get_object_or_404(Tag.objects.prefetch_related('publications', 'publications__tags'), name=name)

相关问题