django正向关系查找

时间:2016-01-17 17:52:37

标签: django left-join django-queryset

我知道它已被回答了几次,仍然来自文档和示例我无法弄清楚我的代码有什么问题: 的 MODEL:

class BaseAbstractModel(models.Model):
  class Meta:
     abstract = True

  version = models.BigIntegerField(default = -1)
  update_time = models.DateTimeField(auto_now=True)
  create_time = models.DateTimeField(auto_now_add=True)

  def save(self, *a, **kw):
    save_lock = LockFactory.get_lock((type(self), self.id,))
    with save_lock:
        self.version += 1
        super(BaseAbstractModel, self).save(*a, **kw)
  objects = BaseAbstractModelManager()

class SessionData(BaseAbstractModel):
    token = models.SlugField(max_length=20)

class SessionDataTransactions(BaseAbstractModel):
  session = models.ForeignKey(SessionData, related_name='transactions')
  submitted = models.DateTimeField(null=True)

我试图执行左连接以执行以下操作:

select main_sessiondata.id, 
main_sessiondata.token,  
main_sessiondatatransactions.submitted  
FROM main_sessiondata 
LEFT JOIN main_sessiondatatransactions ON   
main_sessiondata.id=main_sessiondatatransactions.session_id;

尝试了'过滤','select_related','prefetch_related',一切正常。

是否可以从LEFT(sessionData)获取所有值,无论是否在RIGHT(sessionDataTransactions)上找到匹配的项目?

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

Django不会对反向关系进行连接,因此您描述的行为实际上是默认行为。 SessionData.objects.all().prefetch_related('transactions')在两个查询中会得到相同的结果。