2017-06-13 56 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