我尝试在sqlalchemy查询中进行排序,参数来自" query_sort'其中包含排序参数列表(字段和方向)。
这是代码
def select_all(self, query_paging, query_sort):
""" method to select all the transport type"""
try:
select_all_query =\
self._session.query(TransportType)
for s in query_sort:
select_all_query =\
>> select_all_query.order_by(s.dir(getattr(TransportType, s.field)))\
.limit(query_paging.page_size)\
.offset(query_paging.skip)\
.all()
return select_all_query
except NoResultFound:
return None
然后在py.test中,我尝试使用以下代码测试该程序:
s1 = sort
s1.field = "type"
s1.dir = asc
s2 = sort
s2.field = "transport_type_id"
s2.dir = asc
query_sort = [s1,s2]
query_paging.skip = 1
query_paging.page_size = 10
transport_types = repo.select_all(query_paging, query_sort)
assert len(transport_types) == 1
当我运行测试时,我收到了这个错误:
E AttributeError: 'list' object has no attribute 'order_by'
当我只使用一个数据(s1)时工作正常,但当我尝试使用多个数据进行测试时,它会产生此错误。
答案 0 :(得分:3)
您在查询中调用了/**
* Return video duration in seconds.
*
* @param $video_url
* @param $api_key
* @return integer|null
*/
function youtubeVideoDuration($video_url, $api_key) {
// video id from url
parse_str(parse_url($video_url, PHP_URL_QUERY), $get_parameters);
$video_id = $get_parameters['v'];
// video json data
$json_result = file_get_contents("https://www.googleapis.com/youtube/v3/videos?part=contentDetails&id=$video_id&key=$api_key");
$result = json_decode($json_result, true);
// video duration data
if (!count($result['items'])) {
return null;
}
$duration_encoded = $result['items'][0]['contentDetails']['duration'];
// duration
$interval = new DateInterval($duration_encoded);
$seconds = $interval->days * 86400 + $interval->h * 3600 + $interval->i * 60 + $interval->s;
return $seconds;
}
,它会在列表中返回查询的所有结果:
.all()
所以循环select_all_query =\
select_all_query.order_by(s.dir(getattr(TransportType, s.field)))\
.limit(query_paging.page_size)\
.offset(query_paging.skip)\
.all()
的 next 迭代现在是一个列表。
如果您需要应用不同的排序,请在循环中 :
select_all_query
答案 1 :(得分:1)
我的解决方案是将all().order_by()
更改为filter().order_by()
要按我最近发布的日期订购帖子。
posts = Post.query.filter().order_by('date_posted desc')
希望有帮助。