2014-05-12 15 views
5

Fondamentalmente, voglio solo che json codifichi i risultati della mia query sql.Python Sql Alchemy - Come jsonificare un risultato di un oggetto classe da una query di database

x = db.session.query(User).filter_by(username = request.form['username'], password = request.form['password']).first() 
    print vars(x) 
return jsonify(x) 

raise TypeError(repr(o) + " is not JSON serializable") 

TypeError: < User WashingtonGeorge> is not JSON serializable 

Ecco il risultato della stampa Vars (x)

{'_updated': None, 'username': u'WashingtonGeorge', 'password': u'Washington', '_sa_instance_state': <sqlalchemy.orm.state.InstanceState object at 0x7fd12a50c8d0>, 'firstname': u'George', 'lastname': u'Washington', '_created': None, 'fullname': u'George Washington', '_id': 1, 'email': u'[email protected]'} 
+0

È necessario serializzare i risultati. guarda questa risposta http://stackoverflow.com/questions/7102754/jsonify-a-sqlalchemy-result-set-in-flask?rq=1 – codegeek

+0

http://marshmallow-sqlalchemy.readthedocs.io/en/latest/ –

risposta

0

presumo la variabile '_updated' & '_created' nella vostra class User sono di tipo DateTime. Datetime non è serilzabile in jsonify. Puoi semplicemente convertire la tua variabile datetime in str. ad esempio str (some_date_in_datetimeformat) potrebbe funzionare.
Inoltre, '_sa_instance_state' che è di tipo sqlalchemy.orm.state.InstanceState deve essere serializzabile.

Aggiornamento:

jsonify non è in grado di serializzare l'oggetto. La soluzione migliore è definire una funzione serialize() all'interno della classe e utilizzarla per rendere serializzabili i dati. Quindi la tua classe diventa,

class User(object): 
    def serialize(): 
     return { 
      '_id': 1, 
      'username': u'WashingtonGeorge' 
      'fullname': u'George Washington' 
      # other fields that you need in the json 
     } 

quindi nel luogo in cui si desidera eseguire il jsonify dei dati, basta chiamare.

jsonify(x.serialize()) 
+0

Ho provato a eliminare gli attributi che contenevano campi datetime e il metodo suggerito non funzionava. results = db.session.query (Utente) .filter_by (username = request.form ['username'], password = request.form ['password']). first() del results._created del results._updated print vars (risultati) return jsonify (risultati = risultati) – olleh

+0

Ho aggiornato la mia risposta. Questo è un problema comune con jsonify, ed è stato risposto prima su StackOverflow (vedi il commento di codegeek sulla tua domanda.) –

3

È possibile utilizzare marshallow. Ecco l'esempio. definire un serializer.py e metterlo accanto al vostro file di main.py, e:

in serializer.py

from marshmallow import Serializer 

###### USER SERIALIZER ##### 
class UserSerializer(Serializer): 
    class Meta: 
     # Fields to expose 
     fields = ('username') 
     # you can add any other member of class user in fields 

#Return the user data in json format 
def get_user_serialized(user): 
    return UserSerializer(user).data 

nel vostro main.py

from .serializers import get_user_serialized 
... 
... 
... 

x = db.session.query(User).filter_by(username = request.form['username'], password = request.form['password']).first() 

serialized = [get_user_serialized(item) for item in x] 
res = jsonify(res=serialized) 
return res 
+3

Ecco un elenco aggiornato con marshmallow 1.0: https://gist.github.com/sloria/aecc540db3a95fbbee2f –

Problemi correlati