我需要从多个表中检索数据,并使用动态构建的过滤器,该过滤器可能使用也可能不使用任何表中的数据。在
所以假设我有这个:
class Solution(models.Model):
name = models.CharField(max_length=MAX, unique=True)
# Other data
class ExportTrackingRecord(models.Model):
tracked_id = models.IntegerField()
solution = models.ForeignKey(Solution)
# Other data
在其他地方我需要做的是:
^{pr2}$据我所知,如果我碰巧对Solution中的一个字段进行筛选,django将执行连接,并select_related
获取两个对象。如果我只过滤ExportTrackingRecord
中的字段,那么就没有联接,django将为查询集中的每个ExportTrackingRecord
生成一个新的查询(可能是数千…)
我对django相当陌生,但是有没有合理的方法来强制加入呢?在
select_related
控制计算查询集时加载到结果中的内容。它将强制联接而不考虑过滤。在如果不指定
select_related
,那么即使过滤器生成带有联接的sql查询,父模型的字段也不会加载到结果中,并且访问它们仍然需要额外的查询。在^{} 是解决问题的关键。如果您不使用它并且不过滤相关模型的字段,那么如果您访问相关模型的数据,Django将不会执行联接并对结果中的每一行都进行额外的查询。在
如果执行类似
ExportTrackingRecord.objects.filter(...).select_related('solution')
的操作,则会强制Django始终与Solution
表进行联接。在如果您需要在另一个方向上执行相同的操作,通过反向外键关系ship,您需要^{} ,多对多关系也是如此
相关问题 更多 >
编程相关推荐