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

弥敦道

我有 5 个相关模型要显示在我的模板中。对于每一个Collection我想显示所有Product属于相应集合的(ProductCollection)。我需要为每个产品提供的信息是:名称 ( ProductAlias) 和默认图像 ( ProductImage)。
原始查询应该是这样的:

SELECT c.name, pa.name, pi.image
FROM Collection c JOIN ProductCollection pc ON c.collection_id = pc.collection_id
JOIN Product p ON pc.product_id = p.product_id
JOIN ProductAlias pa on p.product_id = pa.product_id
JOIN ProductImage pi on p.product_id = pi.product_id
WHERE pi.default = 'True' and pa.market_id = 1

models.py

class Collection(models.Model):
  name = models.CharField()

class Product(models.Model):
  video = models.URLField()

class ProductCollection(models.Model):
  collection = models.ForeignKey(Collection, on_delete=models.CASCADE)
  product = models.ForeignKey(Product, on_delete=models.CASCADE)

class ProductAlias(models.Model):
  product = models.ForeignKey(Product, on_delete=models.CASCADE)
  market = models.ForeignKey(Market, on_delete=models.CASCADE)
  name = models.CharField()

class ProductImage(models.Model):
  product = models.ForeignKey(Product, on_delete=models.CASCADE)
  image = models.ImageField()
  default = models.BooleanField()

我将产品的名称分成另一个型号,因为 1 种产品有很多名称,具体取决于它们的销售地区。一个产品也有很多图片。但我只需要全局名称 ( market_id = 1) 和default = True每个Product.

我目前尝试views.py使用基于函数的视图(还没有应用过滤器,因为我在模板渲染期间已经得到了 ValueError):

def collection_view(request):
  # tried to chain the prefetch_related on multiple models but failed.  
  collections = Collection.objects.prefetch_related('productcollection__product__id', 'productalias_set', 'productimage_set').all()
  context = { 'collection_list': collections }
  return render(request, 'product_visualizers/collection.html', context)

我目前对模板的尝试collection.html

{% for collection in collection_list %}
  <h3>{{ collection.name }}</h3>

  {% for pair in collection.productcollection_set.all %}  # what should I loop here to show the product name and product image?
    <p>{{ pair.product.product_id }}</p>  # tried to display the product_id but failed.
    <p>{{ productalias_name }}</p>  # product name.
    <img src="{{ image.url }}">  # product image.
  {% endfor %}

{% endfor %}
一些

您的问题不是由使用预取/选择相关引起的。这些只是为了减少重复查询。pair.product.product_id应该是pair.product.id

根据您设置模型的方式,您有多个 ProductAliases 对应一个 Product,多个 ProductImages 对应一个 Product。您需要遍历他们的两个集合以获取图像和名称字段。

{% for alias in pair.product.productalias_set.all %}
    {{ alias.name }}
{% endfor %}
{% for product_image in pair.product.productimage_set.all %}
    {{ product_image.image }}
{% endfor %}

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

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

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

django 模型 select_related 或 prefetch_related 子模型

如何在Django的DetailView中使用prefetch_related

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

Django ORM使用prefetch_related将相关对象弄乱了

select_related 和 prefetch_related Django

Django prefetch_related 和 select_related

Django 1.9如何使用prefetch_related()查询模型并获取存在预取数据的结果

如何在 Django 中使用 prefetch_related 从查询集中获取属性?

如何使用'select_related'从相关(ForeignKey)django模型中接收并非所有字段

在Django中使用.get()时如何与select_related?

在Django中使用prefetch_related连接ManyToMany字段

在Django中使用select_related函数

Django:如何使用与INNER JOIN FK的FK相关的select_related

如何使用select_related

如何使用 get_or_create 和 select_related 创建 django 模型记录

django prefetch_related和select_related在父表上

django select_related vs prefetch_related 在树状表中

在Django ORM中,select_related和prefetch_related之间有什么区别?

Django的管理员编辑模型选择/ prefetch_related?

无法弄清楚Django中prefetch_related的使用

使用 prefetch_related 优化 Django Queryset Many to Many for 循环

Django prefetch_related的Prefetch,order_by?

Django select_related FK模型

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

我如何prefetch_related()与对象相关的所有内容?

prefetch_related多个级别

在Django中使用select_related选择特定字段

如何在Django中将select_related与GenericForeignKey一起使用?

Django:如何在Paginator中有效使用select_related()?