2012-05-27 27 views
1

我有以下型號:正在生成多少個查詢?

class JobApplication(models.Model): 
    profile = models.ForeignKey(UserProfile) 
    job = models.ForeignKey(JobPost) 

    def __unicode__(self): 
     return "%s - %s" % (self.profile.full_name, self.job.get_job_name()) 

# in JobPost model 
    def get_job_name(self): 
     if self.name: 
      return self.name 
     name = "%s - %s" % (self.production.name, self.position.position) 
     return name 

我怎麼會想出多少查詢時產生JobApplication查詢集正在生成?通常我做print Model.objects.filter().query。在這種情況下,我會怎麼做才能看到它?

+4

檢查http://stackoverflow.com/questions/10695305/how-to-show-the-sql-django-runs/10701259#10701259使用'django.db.connection.queries'和'django-debug-工具欄「來顯示已執行的SQL。 – okm

+0

@okm那麼只能在模板中執行的sql呢?例如,如果我正在執行'for'循環,並且調用一個調用db調用的db方法 - 我無法在視圖中執行任何操作。 (作爲便箋,我已經使用了調試工具欄) – David542

+0

調試工具欄可以收集並顯示在模板中執行的SQL – okm

回答

0

從文檔,

>>> from django.db import connection 
>>> connection.queries 
[{'sql': 'SELECT polls_polls.id,polls_polls.question,polls_polls.pub_date FROM   polls_polls', 
'time': '0.002'}] 

參考鏈接:click here for docs

1

您可以使用內置的日誌記錄工具爲每個生成的查詢輸出到開發服務器上的終端。添加到您的settings.py文件:

# settings.py 
LOG_LEVEL = 'DEBUG' if DEBUG else 'WARNING' 
LOGGING = { 
    'version': 1, 
    'disable_existing_loggers': False, 
    'formatters': { 
     'simple': { 
      'format': '\n%(thread)d: %(levelname)s %(message)s' 
     }, 
    }, 
    'handlers': { 
     'mail_admins': { 
      'level': 'ERROR', 
      'class': 'django.utils.log.AdminEmailHandler' 
     }, 
     'console': { 
      'level': 'DEBUG', 
      'class': 'logging.StreamHandler', 
      'formatter': 'simple' 
     }, 
    }, 
    'loggers': { 
     'django.request': { 
      'handlers': ['mail_admins'], 
      'level': 'ERROR', 
      'propagate': True, 
     }, 
     'multiprocessing': { 
      'handlers': ['console'], 
      'level': LOG_LEVEL, 
      'propagate': False, 
     }, 
     'django': { 
      'handlers': ['console'], 
      'propagate': True, 
      'level': LOG_LEVEL, 
     }, 
     'cache_logger': { 
      'handlers': ['console'], 
      'propagate': True, 
      'level': LOG_LEVEL, 
     } 
    } 
} 

這樣,每當DEBUG是真的,你將可以加載一個視圖或調用一個函數或任何東西,看看生成的查詢,並把完成的時間:

4072: DEBUG (0.016) SELECT "django_content_type"."id", "django_content_type"."name", "django_content_type"."app_label", "django_content_type"."model" 
FROM "django_content_type" WHERE "django_content_type"."id" = 9 ; args=(9,) 
+0

謝謝,我想你忘了添加捕獲db查詢的記錄器:'django.db.backends'。 – David542