2013-10-30 1 views
4

나는 request.args를 sqlalchemy 필터로 전달하는 방법을 알아 내려고 노력해 왔습니다.플라스크 - request.args를 dict로 변환

model.query.filter(**request.args).all() 

를하지만 오류를 던지고 :

나는이 일을해야한다고 생각

TypeError: <lambda>() got an unexpected keyword argument 'userid' 

사용자 ID 또는 기타의 get 인수가 존재합니다.

이 게시물에 따르면 https://stackoverflow.com/questions/19506105/flask-sqlalchemy-query-with-keyword-as-variable에 따르면 필터 기능에 사전을 전달할 수 있습니다.

내가 잘못하고있는 아이디어가 있습니까?

많은 감사합니다 :)

UPDATE : 아래의 포스터에 많은 감사합니다, 그러나 지금은 다음과 같은 오류를 던지고 :

ProgrammingError: (ProgrammingError) (1064, "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') ORDER BY tblclients.clientname' at line 3") 'SELECT favourites.id AS favourites_id, favourites.userid AS favourites_userid, favourites.clientid AS favourites_clientid, favourites.last_visit AS favourites_last_visit \nFROM favourites INNER JOIN tblclients ON tblclients.clientid = favourites.clientid \nWHERE favourites.userid = %s ORDER BY tblclients.clientname' ([u'41'],) 

어떤 아이디어가?

답변

3

사용 filter_by :

model.query.filter_by(**request.args).all() 

filter 이렇게 사용된다 query.filter(Class.property == value)filter_by하면서 같이 사용된다 : query.filter_by(property=value) (첫번째가 표현하는 키워드 인자 인 후자이다).

5

먼저 필터가 아닌 filter_by를 사용해야합니다.

두 번째로, Flask request.args는 동일한 키에 대해 둘 이상의 값을 허용하는 목록 내의 값을 갖는 dict 인 MultiDict를 사용합니다. 동일한 필드가 쿼리 문자열에 두 번 이상 나타날 수 있기 때문입니다. SQL 쿼리가 '41'만 예상했을 때 [u'41 ']를 얻었 기 때문에 오류가 발생했습니다. 당신은 request.args.to_dict()를 사용하여이 문제를 해결하려면 다음

model.query.filter_by(**request.args.to_dict()).all() 
+2

정답입니다. 그리고 그것에 추가하기 위해서 :'request.args.to_dict()'를 사용하는 것은 올바른 것이지만,'dict (request.args)'는 그 값이리스트로 구성된 사전을 생성 할 것이기 때문에 사용하지 마십시오. – Kazanz

0
당신은 페이지 매김을위한 page 같은 비 모델 쿼리 매개 변수가있는 경우 filter_by(**request.args) 그렇지 않으면 당신이이 같은 오류를 얻을, 잘 작동하지 않습니다

:

InvalidRequestError: Entity '<class 'flask_sqlalchemy.JobSerializable'>' has no property 'page' 

내가 모델에 쿼리 매개 변수를하지 무시 같은 것을 사용 :라는 열이있는 모델을 고려

builder = MyModel.query 
    for key in request.args: 
     if hasattr(MyModel, key): 
      vals = request.args.getlist(key) # one or many 
      builder = builder.filter(getattr(MyModel, key).in_(vals)) 
    if not 'page' in request.args: 
     resources = builder.all() 
    else: 
     resources = builder.paginate(
      int(request.args['page'])).items 

curl -XGET "http://0.0.0.0/mymodel_endpoint?page=1&valid=2&invalid=whatever&valid=1" 

invalid은 무시되고, page는 페이지 매기기에 사용할 수 있으며 무엇보다도 다음과 같은 SQL이 생성됩니다 :이 같은 작동합니다 WHERE mymodel.valid in (1,2)

(무료로 위의 코드를 얻을 수 이 번호를 사용하는 경우 boilerplate-saving module)

관련 문제