我在产品上有2个型号公司和产品FK:
class Product(Meta):
company = models.ForeignKey(Company, related_name='products', on_delete=models.CASCADE)
如果View会收集公司产品,那么最佳方法是什么(使用infor形成两种模式):
1)在公司应用中添加View,并使用:
Company.objects.prefetch_related('products').get(pk=company_pk)
2)添加View in products app并作为queryset使用:
Product.objects.select_related('company').filter(company=company_pk)
订购如何与prefetch链接或选择?
答案 0 :(得分:1)
Django文档很好地说明了差异:
prefetch_related(*lookups)
返回将要的QuerySet 在一个批次中自动检索每个相关对象 指定的查找。
这与select_related的目的相似,两者都是 旨在阻止由此引起的数据库查询的泛滥 访问相关对象,但策略完全不同。
select_related通过创建SQL连接并包含字段来工作 SELECT语句中的相关对象。为此原因, select_related获取同一数据库查询中的相关对象。 但是,要避免由此产生的更大的结果集 加入“很多”关系, select_related仅限于 单值关系 - 外键和一对一。
select_related(*fields)
返回一个“跟随”外键关系的QuerySet, 在执行查询时选择其他相关对象数据。 这是一个性能助推器,导致单一更复杂 查询但意味着以后使用外键关系不需要 数据库查询。