【问题标题】:How can I retrieve data from multiple tables如何从多个表中检索数据
【发布时间】:2013-05-16 15:59:34
【问题描述】:

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

所以说我有这个:

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 将为 QuerySet 中的每个 ExportTrackingRecord 生成一个新查询(可能是数千个......)

我对 django 还很陌生,但是有没有一种合理的方法来强制加入?

【问题讨论】:

    标签: python sql database django


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-04-30
        • 2017-07-15
        • 1970-01-01
        • 1970-01-01
        • 2011-12-23
        • 2013-03-26
        相关资源
        最近更新 更多