2017-12-01 1 views
0

주어진 쿼리에서 동적 orm 필터링을 만들 필요가 있습니다.
즉, 일부 입력 사전 제공 :
{"orm_entitiy":"City", attribute":"id","op":">","value":"1"}
query주어진 입력에서 Sqlalchemy orm 동적 쿼리 필터링

가 평가해야합니까 기존 쿼리 개체 : new_filtered_query = query.filter(City.id > 1)

내 질문은 : 당신이 어떤 성숙 라이브러리에 익숙
1인가 이 필요를 해결합니까?
2. 나는 SOblog에서 솔루션을 보았다,하지만 난 부분을 이해하는 데 어려움이 있습니다

attr = list(filter(
         lambda e: hasattr(column, e % op), 
         ['%s', '%s_', '__%s__'] 
        ))[0] % op 

누군가가 세부 사항이 뒤에 논리를 설명하시기 바랍니다 수 있습니까?

답변

1

이 표현식을보다 장황하게 만들지 마십시오.

existing_attrs = list(filter(<filter_func>, potential_attributes)) 
attr = existing_attrs[0] % op 

<filter_func> 라인의 체크를 통과 potential_attributes에서 오브젝트들의리스트를 생성한다.
두 번째 줄은 더 간단합니다. 첫 번째 기존 특성을 가져 와서 문자열 서식을 적용합니다.

<filter_func>lambda e: hasattr(column, e % op)입니다 : column가 적용된 서식 문자열 현재 potential_attribute입니다 e % op라는 이름의 속성을 가지고있는 경우는 True를 반환합니다. 예를 들어

, potential_attributes['%s', '%s_', '__%s__']하고 opgt 경우는, 다음과 같은 속성이 선택됩니다 column.gt, column.gt_column.__gt__을.

column.gt_ 속성이 있다고 가정 해 보겠습니다. 따라서 검사를 통과 한 값은 %s_이며 existing_attrs의 목록에 저장됩니다. 그런 다음 두 번째 줄 (attr = '%s_' % 'gt')은 'gt_' 문자열을 생성합니다.

+0

'e % op'의 의미는 무엇입니까? – JavaSa

+0

문자열 형식 연산자입니다. https://docs.python.org/2/library/stdtypes.html#string-formatting 예 :' "% 02d"% 9'은''09 "'입니다. – leovp

관련 문제