Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django 不必要地查找相关字段_Django_Django Models_Django Orm - Fatal编程技术网

Django 不必要地查找相关字段

Django 不必要地查找相关字段,django,django-models,django-orm,Django,Django Models,Django Orm,我有一个django模型,看起来像这样: class A(models.Model): b = models.ForeignKey(B) n = models.IntegerField() 我的django shell配置为在启动后立即打印所有sql查询。 那么,写作 a = A.objects.get(id=10) 打印一个查询以从表A中检索对象 我不明白的是,编写print a.n会触发一个查询来检索相关的B元素 有人能解释一下为什么Django需要检索元素B,而我还没有

我有一个django模型,看起来像这样:

class A(models.Model):
    b = models.ForeignKey(B)
    n = models.IntegerField()
我的django shell配置为在启动后立即打印所有sql查询。 那么,写作

a = A.objects.get(id=10)
打印一个查询以从表
A
中检索对象

我不明白的是,编写
print a.n
会触发一个查询来检索相关的
B
元素

有人能解释一下为什么Django需要检索元素
B
,而我还没有访问它吗?(我也不打算这么做,所以这对我来说是一笔开销。)

编辑

这是@Daniel要求的原始代码:

>> x=PlayedGamesModel.objects.get(pkey='i01E25D45526E14EA0A490D36@AdobeID16688802f8024509a8e431b644108a82')
[2014-03-05 12:46:15,174] (0.326) SELECT `appConnexions_playedgamesmodel`.`pkey`, `appConnexions_playedgamesmodel`.`user_id`, `appConnexions_playedgamesmodel`.`game_id`, `appConnexions_playedgamesmodel`.`playedFromBrowser`, `appConnexions_playedgamesmodel`.`playedFromConnexions`, `appConnexions_playedgamesmodel`.`deleted`, `appConnexions_playedgamesmodel`.`timestamp` FROM `appConnexions_playedgamesmodel` WHERE `appConnexions_playedgamesmodel`.`pkey` = 'i01E25D45526E14EA0A490D36@AdobeID16688802f8024509a8e431b644108a82' ; args=('i01E25D45526E14EA0A490D36@AdobeID16688802f8024509a8e431b644108a82',)
>> print x.playedFromConnexions
1
[2014-03-05 12:46:17,993] (0.319) SELECT `appConnexions_gamemodel`.`gameID`, `appConnexions_gamemodel`.`gameURL`, `appConnexions_gamemodel`.`title`, `appConnexions_gamemodel`.`longTitle`, `appConnexions_gamemodel`.`category`, `appConnexions_gamemodel`.`description`, `appConnexions_gamemodel`.`iconURL`, `appConnexions_gamemodel`.`screenshotURL`, `appConnexions_gamemodel`.`genre`, `appConnexions_gamemodel`.`minOS`, `appConnexions_gamemodel`.`price`, `appConnexions_gamemodel`.`isBlacklisted`, `appConnexions_gamemodel`.`swfURL`, `appConnexions_gamemodel`.`androidURL`, `appConnexions_gamemodel`.`windowsURL`, `appConnexions_gamemodel`.`iosURL`, `appConnexions_gamemodel`.`publisher_id`, `appConnexions_gamemodel`.`lastUpdated` FROM `appConnexions_gamemodel` WHERE `appConnexions_gamemodel`.`gameID` = '16688802f8024509a8e431b644108a82' ; args=(u'16688802f8024509a8e431b644108a82',)
[2014-03-05 12:46:18,597] (0.292) SELECT `appConnexions_usermodel`.`userID`, `appConnexions_usermodel`.`fID`, `appConnexions_usermodel`.`gID`, `appConnexions_usermodel`.`name`, `appConnexions_usermodel`.`avatarURL`, `appConnexions_usermodel`.`age`, `appConnexions_usermodel`.`country`, `appConnexions_usermodel`.`email`, `appConnexions_usermodel`.`settingsBitset`, `appConnexions_usermodel`.`allowLogin`, `appConnexions_usermodel`.`allowAutomaticAdd`, `appConnexions_usermodel`.`allowActivityShare`, `appConnexions_usermodel`.`logoutFromBrowser` FROM `appConnexions_usermodel` WHERE `appConnexions_usermodel`.`userID` = 'i01E25D45526E14EA0A490D36@AdobeID' ; args=(u'i01E25D45526E14EA0A490D36@AdobeID',)

PlayedGamesModel
是与
GameModel(appConnexions\u GameModel)
UserModel(appConnexions\u UserModel)
相关的表。从
PlayedGamesModel
打印一个整数值(
playedFromConnexions
)将不必要地向
GameModel
UserModel
触发查询。

Mayank,您只想检索
n
??然后使用查询集的
值\u列表
。还可以查看
选择相关的
。你以后可能需要它。a=a.object.get(id=10)实际上应该触发一个查询。正如卡努指出的那样,你对问题的描述是非常错误的:使用
get
,查询会立即完成。但除非您要求,否则不会执行任何查询来访问
b
。您需要返回并发布您的确切代码,并用示例显示正在触发的查询。是的。这是不正确的。它确实会对get语句本身发出查询。我把它和查询集混淆了。但是当我打印a.n时,B就会被查询。这是我无法理解的。然后,对那些经常调用的情况进行微调,如其他人所说的使用值列表,并根据需要实例化对象B,无论如何都会使用20%/80%规则(80%时运行20%的代码)