2017-06-13 55 views
2

我有這樣的事情:修改燒瓶不寧結果數組

{ 
    "id": 1, 
    "username": "plasmy", 
    "userdetails": [ 
    { 
     "detail": "A Name", 
     "detail_name": "Full Name", 
     "id": 1, 
     "user_id": 1 
    }, 
    { 
     "detail": "[email protected]", 
     "detail_name": "Email", 
     "id": 2, 
     "user_id": 1 
    }, 
    { 
     "detail": "An Address", 
     "detail_name": "Address", 
     "id": 3, 
     "user_id": 1 
    }, 
    { 
     "detail": "999-999-9999", 
     "detail_name": "Phone Number", 
     "id": 4, 
     "user_id": 1 
    } 
    ] 
} 

此之際,使用Flask_Restless和SQLAlchemy的結果。有一個用戶表和userdetails的表,放在該JSON的userdetails部分。我想要做的是,找到一種方法,其中的數據可以是這樣的:

{ 
    "id": 1, 
    "username": "plasmy", 
    "userdetails": { 
     "Full Name": "A Name", 
     "Email": "[email protected]", 
     "Address": "An Address", 
     "Phone Number": "A Phone Number" 
    } 
} 

看我怎麼刪除ID和我使用的字段「DETAIL_NAME」爲重點和「細節」的價值。我嘗試使用預處理器,但他們沒有工作,或者我錯誤地使用它們。我把預處理器放在「子」表中。

這就是我想這樣做(但不工作):

def detail_sort(results): 
    return {'user_details': results['userdetails']} 


manager.create_api(User, methods=['GET', 'POST']) 
manager.create_api(UserDetails, methods=['GET', 'POST'], 
        preprocessors={ 
         'GET_COLLECTION': [detail_sort] 
        }) 

我試過GET_COLLECTION,GET_SINGLE和GET_MANY。任何幫助,將不勝感激。

UPDATE:這裏是新的代碼我試圖根據答案

from flask import Blueprint 
from medinv import manager 
from medinv.User.models import User, UserDetails 

blueprint = Blueprint('blueprint', __name__) 


@blueprint.route('/') 
@blueprint.route('/home') 
def home(): 
    return "Welcome." 


def detail_sort(results): 
    print(results) 
    results['userdetails'] = {item['detail_name']: item['detail'] for item in results['userdetails']} 
    return results['userdetails'] 


manager.create_api(User, methods=['GET', 'POST']) 
manager.create_api(UserDetails, methods=['GET', 'POST'], 
        postprocessors={ 
         'GET_COLLECTION': [detail_sort] 
        }) 

回答

2

我認爲你需要,因爲你需要修改發送回客戶端之前JSON響應使用postproccessors。

好的,我轉載了你的問題。現在它正在工作。這裏是我的代碼:

import flask 
import flask_sqlalchemy 
import flask_restless 

# Create the Flask application and the Flask-SQLAlchemy object. 
app = flask.Flask(__name__) 
app.config['DEBUG'] = True 
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:////tmp/test.db' 
db = flask_sqlalchemy.SQLAlchemy(app) 


# Create your Flask-SQLALchemy models as usual but with the following 
# restriction: they must have an __init__ method that accepts keyword 
# arguments for all columns (the constructor in 
# flask_sqlalchemy.SQLAlchemy.Model supplies such a method, so you 
# don't need to declare a new one). 

class User(db.Model): 

    __tablename__ = 'user' 

    id = db.Column(db.Integer, primary_key=True) 
    username = db.Column(db.String) 
    userdetails = db.relationship('UserDetails', backref='User', lazy='dynamic') 


class UserDetails(db.Model): 

    __tablename__ = 'user_details' 

    id = db.Column(db.Integer, primary_key=True) 
    detail = db.Column(db.String) 
    detail_name = db.Column(db.String) 
    user_id = db.Column(db.Integer, db.ForeignKey("user.id"), nullable=False) 

# Create the database tables. 
db.create_all() 

# Create the Flask-Restless API manager. 
manager = flask_restless.APIManager(app, flask_sqlalchemy_db=db) 

user = User(username='plasmy') 
userdetail_0 = UserDetails(detail='A name', detail_name='Full Name') 
userdetail_1 = UserDetails(detail='[email protected]', detail_name='Email') 
userdetail_2 = UserDetails(detail='An Address', detail_name='Address') 
userdetail_3 = UserDetails(detail='999-999-9999', detail_name='Phone Number') 


user.userdetails.append(userdetail_0) 
user.userdetails.append(userdetail_1) 
user.userdetails.append(userdetail_2) 
user.userdetails.append(userdetail_3) 

db.session.add(user) 
db.session.commit() 

print('USER CREATED') 

def detail_sort(result, **kw): 
    print('detail_sort called') 
    print(result) 

    for entry in result['objects']: 
     entry['userdetails'] = {item['detail_name']: item['detail'] for item in 
           entry['userdetails']} 
    print('MODIFIED JSON: ', result) 

# Create API endpoints, which will be available at /api/<tablename> by 
# default. Allowed HTTP methods can be specified as well. 
# manager.create_api(Person, methods=['GET', 'POST', 'DELETE']) 
# manager.create_api(Article, methods=['GET']) 

manager.create_api(User, methods=['GET', 'POST', 'DELETE'], 
        postprocessors={ 
         'GET_MANY': [detail_sort] 
        }) 
manager.create_api(UserDetails, methods=['GET'],) 

# start the flask loop 
app.run(use_reloader=False) 

請注意,您需要使用GET_MANY,看看如何detail_sort實現。

不使用後處理器的反應是這樣的:

{ 
    "num_results": 1, 
    "objects": [ 
    { 
     "id": 1, 
     "userdetails": [ 
     { 
      "detail": "A name", 
      "detail_name": "Full Name", 
      "id": 1, 
      "user_id": 1 
     }, 
     { 
      "detail": "[email protected]", 
      "detail_name": "Email", 
      "id": 2, 
      "user_id": 1 
     }, 
     { 
      "detail": "An Address", 
      "detail_name": "Address", 
      "id": 3, 
      "user_id": 1 
     }, 
     { 
      "detail": "999-999-9999", 
      "detail_name": "Phone Number", 
      "id": 4, 
      "user_id": 1 
     } 
     ], 
     "username": "plasmy" 
    } 
    ], 
    "page": 1, 
    "total_pages": 1 
} 

隨着後處理的響應如下所示:

{ 
    "num_results": 1, 
    "objects": [ 
    { 
     "id": 1, 
     "userdetails": { 
     "Address": "An Address", 
     "Email": "[email protected]", 
     "Full Name": "A name", 
     "Phone Number": "999-999-9999" 
     }, 
     "username": "plasmy" 
    } 
    ], 
    "page": 1, 
    "total_pages": 1 
} 

希望這有助於。

+0

謝謝你的回答。我試過了,但沒有奏效。我將在原始文章中編輯我的views.py代碼,以查看是否可以看到任何錯誤。此外,說結果['userdetails'] = ....的部分給我一個錯誤,說這是不可能的。我試着改變它,只返回結果['userdetails']並且錯誤消失,但它仍然不起作用。事實上,我嘗試做一個打印,它不會到達那裏(detail_sort)。 – plasmy

+0

@plasmy你會得到什麼錯誤?嘗試先在結果中爲關鍵用戶代碼設置值,然後將其返回。我沒有測試過我的代碼。 – Nurjan

+0

是的,我確實嘗試過,錯誤沒有出現。問題是它仍然沒有做我想做的事。 – plasmy