Django - 外键和多对多参考 - 如何知道查询数量?

时间:2015-08-06 19:20:24

标签: python django postgresql

在获取包含关系的模型时,如何知道Django是否正在运行多个查询?

以下是一个例子:

class ModelOne(models.Model):

    '''...the stuff...'''

class ModelTwo(models.Model):
    something = models.ForeignKeyField(ModelOne)

    '''...all the things...'''

class ModelThree(models.Model):
    something_elses = model.ManyToManyField(ModelTwo)

class ModelFour(models.Model):
    now_this_is_just_silly = models.ManyToManyField(ModelThree)

让我们说我像这样获取ModelFour:

m = ModelFour.objects.all()[0]

如果认为默认情况下所有子模型一直到ModelOne都是其数据结构的一部分,那将是非常棒的。是这样的吗?

如果我开始向下导航ModelFour的数据结构以访问ModelOne中的属性(东西),我是否会执行多个查询?

根据django的建议,这是一个postgres数据库设置。

2 个答案:

答案 0 :(得分:1)

您可以查看postgres的查询计数,并在查询完成后再次检查

使用此查询读取所有数据库中执行的事务总数:

SELECT sum(xact_commit+xact_rollback) FROM pg_stat_database;

如果您只想为一个数据库使用相同的计数器,请使用:

SELECT xact_commit+xact_rollback FROM pg_stat_database WHERE datname = 'mydb';

信用到:https://dba.stackexchange.com/questions/35940/how-many-queries-per-second-is-my-postgres-executing

您可以使用以下命令列出当前正在运行的查询:

SELECT datname,procpid,current_query FROM pg_stat_activity

来自:http://chrismiles.info/systemsadmin/databases/articles/viewing-current-postgresql-queries/

答案 1 :(得分:1)

要计算n个查询,请尝试使用connection from django.db(在settings.py中确保DEBUG=True):

from django.db import connection

m = ModelFour.objects.all()[0]

print len(connection.queries)

...如果您只想查看列表中的查询,请删除len