对于下面的示例模式
# 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_related
和prefetch_related
等函数对其进行归档。
假设每个模型的相关名称将是模型的名称和_items
,但最好有适当的模型名称,然后提供有意义的相关名称。相关名称是向后访问模型的方式。
通过这种方式,您可以使用此查询在单个数据库中获取所有模型:
A.objects.all().select_related("n", "d", "n__d").prefetch_related("n__p_items")
我在粘贴的网站上编辑了代码,但是,它很快就会过期。