gpt4 book ai didi

mysql - Django模型查询的数据库访问机制

转载 作者:行者123 更新时间:2023-11-29 04:35:06 26 4
gpt4 key购买 nike

class parent(models.Model):
ap=models.CharField(max_length=10)
user=models.CharField(max_length=10)

class Meta:
unique_together=(("ap","user"),)
db_table='parent'


class child(models.Model):
userkey=models.ForeignKey(parent,on_delete=models.CASCADE,db_column="ap")
pn=models.CharField(max_length=10)
st=models.CharField(max_length=10,default='Y')

def get_ap(self):
return self.ap.ap
def get_pn(self):
return self.pn
class Meta:
db_table="child"
unique_together=(('userkey','pn'),)

假设我有 ap="apkey"然后我可以通过以下查询访问“apkey”的所有子模型对象。

child_obj=child.objects.filter(userkey__ap="apkey")

这也可以在不使用外键关系的情况下完成,如下所示。

parent_obj=parent.objects.get(ap="apkey")
child_obj=child.objects.filter(userkey=parent_obj)

我必须知道的是,在这两种方法中执行查询时发生了多少次数据库访问。 ?

在第二个中,我们知道它访问一次父表,然后访问一次子表。因此实际上发生了两个sql查询。

第一个呢?

最佳答案

Django 查询集本质上是惰性的。 see here in documentation .因此,从技术上讲,当您执行第二段代码时,只有一次数据库命中。

进一步阐述,从文档中说明。

q = Entry.objects.filter(headline__startswith="What")
q = q.filter(pub_date__lte=datetime.date.today())
q = q.exclude(body_text__icontains="food")
print(q)

虽然这看起来像三次数据库命中,但实际上它只命中一次数据库,在最后一行 (print(q))。通常,在您“请求”之前,不会从数据库中获取 QuerySet 的结果。

对于落后关系see docs here ,在运行 settings.py 时,将创建后向关系,从技术上讲,它们也应该只受到一次打击。但我对此不是很确定,因为到目前为止我还没有在我记得的文档中找到任何相关内容。

希望这对您有所帮助。谢谢。

关于mysql - Django模型查询的数据库访问机制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45072086/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com