django查询集上的多个联接



对于下面的示例模式

# schema sameple

class A(models.Model):
n = models.ForeignKey(N, on_delete=models.CASCADE)
d = models.ForeignKey(D, on_delete=models.PROTECT)

class N(models.Model):
id = models.AutoField(primary_key=True, editable=False)
d = models.ForeignKey(D, on_delete=models.PROTECT)

class D(models.Model):
dsid = models.CharField(max_length=255, primary_key=True)

class P(models.Model):
id = models.AutoField(primary_key=True, editable=False)
name = models.CharField(max_length=255)
n = models.ForeignKey(N, on_delete=models.CASCADE)

# raw query for the result I want

# SELECT P.name
# FROM P, N, A
# WHERE (P.n_id = N.id
#     AND A.n_id = N.id
#     AND A.d_id = 'MY_DSID'
#     AND P.name = 'MY_NAME')

我想实现什么?

好吧,我正试图找到一种方法,以某种方式编写一个与上面的原始查询相同的查询集。到目前为止,我可以通过编写两个查询集,使用一个查询集的结果,然后使用我编写的第二个查询集来获得最终的DB记录。然而,这对DB来说是2次命中,我想通过在一次命中中完成所有操作来优化它。

这种原始查询的查询集是什么?或者有更好的方法吗?

上面的代码在这里https://dpaste.org/DZg2

您可以使用related_name属性和select_relatedprefetch_related等函数对其进行归档。

假设每个模型的相关名称将是模型的名称和_items,但最好有适当的模型名称,然后提供有意义的相关名称。相关名称是向后访问模型的方式。

通过这种方式,您可以使用此查询在单个数据库中获取所有模型:

A.objects.all().select_related("n", "d", "n__d").prefetch_related("n__p_items")

我在粘贴的网站上编辑了代码,但是,它很快就会过期。

相关内容

  • 没有找到相关文章

最新更新