from app import db from datetime import datetime, date class AutoSerialize(object): 'Mixin for retrieving public fields of model in json-compatible format' __public__ = None def get_public(self, exclude=(), extra=()): "Returns model's PUBLIC data for jsonify" data = {} keys = self._sa_instance_state.attrs.items() public = self.__public__ + extra if self.__public__ else extra for k, field in keys: if public and k not in public: continue if k in exclude: continue value = self._serialize(field.value) if value: data[k] = value return data @classmethod def _serialize(cls, value, follow_fk=False): if type(value) in (datetime, date): ret = value.isoformat() elif hasattr(value, '__iter__'): ret = [] for v in value: ret.append(cls._serialize(v)) elif AutoSerialize in value.__class__.__bases__: ret = value.get_public() else: ret = value return ret class Gas(db.Model, AutoSerialize): """ Create a gas table """ __table_args__ = {'extend_existing': True} __tablename__ = 'gas' __public__ = ('price', 'volume', 'milage', 'date', 'wintertyre', 'car', 'id') id = db.Column(db.Integer, primary_key=True) price = db.Column(db.Integer) volume = db.Column(db.Integer) milage = db.Column(db.Integer) date = db.Column(db.DateTime, default=datetime.utcnow) winterTyre = db.Column(db.Boolean) car_id = db.Column(db.Integer, db.ForeignKey('car.id')) def __ref__(self): return ''.format(self.id) class Car(db.Model, AutoSerialize): """ Create a table of cars """ __tablename__ = 'car' __public__ = ('name', 'id') id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(50)) cars = db.relationship('Gas', backref='car', lazy='dynamic') def __ref__(self): return ''.format(self.id)