list属性没有按

时间:2015-06-04 06:57:38

标签: python sql sqlalchemy

我尝试在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)时工作正常,但当我尝试使用多个数据进行测试时,它会产生此错误。

2 个答案:

答案 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')

希望有帮助。