在Django中获取相关对象以及如何将Prefetch与相关模型一起使用

拉德克

models.py

class Press(models.Model):
    created = models.DateTimeField(editable=False)
    title = models.CharField(max_length=500, blank=True)
    slug = models.SlugField(max_length=600, blank=True, unique=True)

    def __str__(self):
        return self.title

class Scan(models.Model):
    press = models.ForeignKey(Press, related_name='scans', on_delete=models.CASCADE)
    created = models.DateTimeField(editable=False)
    title = models.CharField(max_length=300, blank=True)
    main_scan = models.ImageField(upload_to='press/scans', blank=True)

    def __str__(self):
        return self.title

views.py

class PressListView(ListView):
    model = Press
    context_object_name = "press"
    template_name = "press.html"

    def get_context_data(self, **kwargs):
        # Call the base implementation first to get a context
        context = super().get_context_data(**kwargs)
        context['press'] = 
Press.objects.prefetch_related(Prefetch('scans', 
queryset=Scan.objects.select_related('press')))
        return context

我想在该站点的前端实现的功能是列出所有Press,并且作为每一个的封面图像,都希望使用main_scanScan模型中的一幅图像

我知道我可以添加models.ImageFieldPress模型中,但是我不想添加-在我admin.TabularInline从附加到Press模型的扫描模型中使用的管理中

我知道有关于预取的文档,但是可能我在模板中的前端使用了错误的代码以及使用错误的代码。

问题是如何使其非常优化,以使其性能最佳,只需一次访问数据库。

以前我是这样做的,但确实有效,但是这导致15个对象的15条重复SQL语句-通过使用django-toolbar我正在检查它的性能非常低效。

{% for article in press %}
{{ article.title }}<br>
<img src="{{ MEDIA_URL }}{{ article.scans.all.0.main_scan }}" alt="">
{% endfor %}

我的目标是通过预取或其他方式访问数据库一次。下面的代码无效,因此views.py错误,HTML也是如此。

{% for article in press %}
{{ article.title }}<br>
<img src="{{ MEDIA_URL }}{{ article.scans.main_image }}" alt="">
{% endfor %}

更新:15重复不见了。使用优化后的3个查询Prefetch()

优化后的查询

溴西api

使用时Prefetch(),应分配一个to_attr属性名称,预取对象列表将在该属性名称下可用。当前,多余的查询是press由于您分配了访问字段反向关系的结果related_name='scans'

如果将属性重命名为,则可以访问预取的相关对象scans_list

press = Press.objects.prefetch_related(Prefetch(
    'scans',
    queryset=Scan.objects.select_related('press'),
    to_attr='scans_list'
))

然后,您可以在模板中执行以下操作:

{% for article in press %}
{{ article.title }}<br>
<img src="{{ MEDIA_URL }}{{ article.scans_list.0.main_scan }}" alt="">
{% endfor %}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何使用 prefetch_related 获取 Django 相关模型中的最新位置

如何通过相关对象查询模型并使用Django ORM在queryset中获取相关对象

如何将 2 个相关子查询与 Join 和 Conditional Aggregation 一起使用

在Django模型中使用Greatest函数时如何获取注释中的相关对象列表

如何将罗盘内联图像助手与不相关的图像URL一起使用?

如何将Spearman相关p值与相关系数一起添加到ggpairs?

Rails一起创建相关模型

R,ggplot,使用抖动时如何将相关点保持在一起?

如何在雄辩的模型 laravel 中动态设置外键以及如何将其与 withCount 一起使用

如何将Django的APIRequestFactory与一系列对象一起使用?

将PIVOT与2个相关表一起使用

如何使用prefetch_related在admin list_display中获取自定义列的相关模型?

Django-如何使用单个查询集在用户的关系模型中获取所有相关对象

如何从 json 数组中获取 Json 对象并将它们与模型类一起使用

如何将通用对象工具与通过 Typescript 中的接口描述的对象一起使用?

为什么以及如何将new关键字与类的现有对象一起使用?

如何将关联对象与枚举一起使用?

如何将ngRepeat与对象一起使用?

如何将“ with”与对象列表一起使用

如何将IN与块而不是对象一起使用?

如何将useState与对象一起使用?

如何将 processStrategy 与对象模式一起使用

Django-获取与每个对象相关的所有相关模型

获取所有相关的Django模型对象

如何从Django Rest Framework中的相关模型中获取数据?

如何将django-avatar与我自己的用户模型一起使用,而不与django.contrib.auth.models.User一起使用

如何在 Django 中使用 select_related 或 prefetch_related 加入多个相关模型?

Django:如何正确显示相关模型中的对象列表?

如何将两个独立的相关热图的一半压缩在一起?