Я использую Flask-Restplus и SQLAlchemy для разработки своего API.Я хочу вернуть ответ с информацией от двух объектов SQAlchemy, пользователя и устройства, с соотношением 1: 1 между ними.
У меня есть запрос, который выглядит следующим образом:
details = db.session.query(User, Device).filter(User.id == Device.id) \
.filter(User.email== data['email'])\
.all()
На данный момент результат запроса выше может быть напечатан в консоли так:
[(<User 'None'>, <Device 1>)]
Я хочу, чтобы моя конечная точка API возвращала следующий JSON:
{
"data": [
[
{
"id": 20,
"name": null,
"token": "Some String here"
}
]
]
}
Вот мой DTO:
class UserDto:
# this is for input
user = api.model('user', {
'email': fields.String(required=False, description='phone number'),
'name': fields.String(required=False, description='username'),
'device_id': fields.String(required=False,description='user_device_id'),
})
# this is for output
details = api.model('details', {
'id': fields.Integer(required=False, description='the id'),
'name': fields.String(required=False, description='name'),
'token': fields.String(required=False, description='token')
})
Модели для User
и Device
:
class User(db.Model):
__tablename__ = "users_info"
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
name = db.Column(db.Integer, unique=True, nullable=True)
email = db.Column(db.String)
device = db.relationship('Device', backref='user')
# .. more fields ..
class Device(db.Model):
__tablename__ = "user_device"
user_device_id = db.Column(db.Integer, primary_key=True, autoincrement=True)
id = db.Column(db.Integer, db.ForeignKey(User.id))
token = db.Column(db.String, nullable=True)
# .. more fields ..
Я заказываю для достижения результата JSON выше, я хочу, чтобы id
и name
были от объекта User
, а token
от объекта Device
.
Контроллер:
api = UserDto.api
_user = UserDto.user
_details = UserDto.details
@api.route('/')
class User(Resource):
@api.response(201, 'successful')
@api.expect(_user, validate=True)
@api.marshal_list_with(_details, envelope='data')
def post(self):
data = request.json
return user(data=data)
Фактический ответ:
{
"data": [
[
{
"id": 20,
"name": null,
"token": null
},
{
"id": 20,
"name": null,
"token": "some string here"
}
]
]
}
Как вы можете видеть здесь, одна и та же запись появляется 2 раза дважды (один раз с token
равным null
и один раз с token
снужная строка).
Как мне получить ответ, который я хочу выше?