最佳项目组织和查询集

时间:2017-12-08 14:33:07

标签: django django-queryset

我在产品上有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链接或选择?

1 个答案:

答案 0 :(得分:1)

Django文档很好地说明了差异:

  

prefetch_related(*lookups)

     

返回将要的QuerySet   在一个批次中自动检索每个相关对象   指定的查找。

     

这与select_related的目的相似,两者都是   旨在阻止由此引起的数据库查询的泛滥   访问相关对象,但策略完全不同。

     

select_related通过创建SQL连接并包含字段来工作   SELECT语句中的相关对象。为此原因,   select_related获取同一数据库查询中的相关对象。   但是,要避免由此产生的更大的结果集   加入“很多”关系, select_related仅限于   单值关系 - 外键和一对一。

     

select_related(*fields)

     

返回一个“跟随”外键关系的QuerySet,   在执行查询时选择其他相关对象数据。   这是一个性能助推器,导致单一更复杂   查询但意味着以后使用外键关系不需要   数据库查询。