是否会对查询集进行评估,即如果我只是对查询集进行字符串化处理,django是否会命中数据库?
i.e以下语句是否会使数据库命中?
str(Model.objects.all())
documentation并没有明确提及str()
答案 0 :(得分:1)
是的,因为在这种情况下getAvailableLocationsList(index, locationIndex) {
let locationList = []; // Array- from service;
const list= <FormArray>this.form.get('list');
const locationArray =
<FormArray>list.controls[index].get('locationArray')['controls'][locationIndex].get('location');
const locationVal = locationArray.value;
const selectedLoc = _.findWhere(locationList, { address: locationVal });
if (!_.isUndefined(selectedLoc)) {
locationList = _.filter(locationList, (eachLoc) => {
return eachLoc.address.id!== selectedLoc.id;
});
}
return locationList;
}
使用str
。
根据python中的this excellent SO answer on repr vs str:
如果定义了
__repr__
,而没有定义__repr__
,则对象将表现 就像__str__
从the django code看,我们看到__str__=__repr__
被定义,而__repr__
没有被定义,因此我们可以推断__str__
上的文档也涵盖了repr
很容易自己测试这种事情:
str
调用>>> from django.db import connection
>>> len(connection.queries)
0
>>> str(User.objects.all())
"<QuerySet [<User: test>, ...]>"
>>> len(connection.queries)
1
不会直接命中数据库,这是惰性查询集评估的优点。直到需要响应元素(如OP指向的文档中所述)时,才触发DB查询。
答案 1 :(得分:0)
对于stringfy,我认为不会有任何数据库命中。仅针对Model.objects.all()
,它将访问数据库。结果到达后,它将对查询集进行字符串查询,而不会导致数据库命中。
str()只是将类型转换为字符串的函数。
答案 2 :(得分:0)
您的代码将只进入数据库一次。调用Model.objects.all()
将包含发送到数据库的SQL转换。应用程序收到str()
调用后,只会调用模型内的__str__
方法。如果未定义,我认为它将返回一个涉及主键的默认语法(因为为了可读性和测试目的,我总是定义__str__
,所以我不记得了)。