字符串化查询集

时间:2019-05-06 09:23:05

标签: python-3.x django-rest-framework django-queryset

是否会对查询集进行评估,即如果我只是对查询集进行字符串化处理,django是否会命中数据库?

i.e以下语句是否会使数据库命中?

str(Model.objects.all())

documentation并没有明确提及str()

3 个答案:

答案 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__,所以我不记得了)。