1

我需要使用动态构建的过滤器从多个表中检索数据,该过滤器可能使用也可能不使用任何表中的数据。

所以说我有这个:

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

然后在其他地方我需要做:

 def get_data(user_provided_criteria):
      etr = ExportTrackingRecord.objects.filter(make_Q_object(user_provided_criteria)).select_related()

      for data in etr: 
          s = data.solution
          # do things with data from both tables

据我所知,如果我碰巧在解决方案中过滤了一个字段,django 将进行连接,并select_related获取两个对象。如果我只过滤其中的字段,ExportTrackingRecord那么将没有连接,django 将为ExportTrackingRecordQuerySet 中的每个生成一个新查询(可能是数千个......)

我对 django 相当陌生,但是有没有合理的方法来强制加入?

4

2 回答 2

1

select_related()是你问题的关键。如果您不使用它并且不对相关模型的字段进行过滤,那么如果您正在访问相关模型的数据,Django 将不会执行连接并导致对结果中的每一行进行额外查询。

如果您执行类似的操作ExportTrackingRecord.objects.filter(...).select_related('solution'),则强制 Django 始终与Solution表进行连接。

如果你需要在另一个方向做同样的事情,通过你需要的反向外键关系prefetch_related(),多对多关系也是如此

于 2013-05-21T20:09:35.067 回答
0

select_related控制在评估 QuerySet 时加载到结果中的内容。无论过滤如何,它都会强制加入。

如果您不指定select_related,那么即使您的过滤器生成带有连接的 sql 查询,父模型的字段也不会加载到结果中,并且访问它们仍然需要额外的查询。

于 2013-05-21T21:19:20.257 回答