获取父表sqlAlchemy的列

时间:2017-08-17 03:36:52

标签: python json flask orm sqlalchemy

我在SqlAlchemy中有两个模型,它们之间具有外键关系。我需要的是,当我得到一个passthrough的对象作为json时,它也应该包含Post模型的一些预定义列。

就像在这种情况下一样,我需要将User模型的名称列与User对象一起返回。

我试图在Post模型中添加一个json属性,但它只返回模型。

Post

3 个答案:

答案 0 :(得分:0)

如果我理解正确,您正在查询Post模型,并希望返回User和用户信息的子集,但只看到Post.user_id ?在这种情况下,我会使用sqlalchemy提供的relationship属性:

http://docs.sqlalchemy.org/en/latest/orm/basic_relationships.html#many-to-one

这样你的Post类看起来类似于

class Post(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    message = db.Column(db.String(255))
    created_at = db.Column(db.DateTime())
    user_id = db.Column(db.Integer, db.ForeignKey('user.id'))
    user = relationship(User, back_populates="user", uselist=False)

答案 1 :(得分:0)

您应该使用relationship中的SQLAlchemy并修改to_json以解析relationship

class Post(db.Model):

    # other fields

    user = db.relationship("User", foreign_keys=user_id)

    @property
    def json(self):

        attrs = self.__mapper__.attrs.keys()

        relationships = self.__mapper__.relationships.keys()

        fields = [item for item in [attr for attr in attrs if attr not in relationships]]

        container = {field: getattr(self, field) for field in fields}

        for relationship in relationships:

            related = getattr(self, relationship)

            if related:

                is_list = self.__mapper__.relationships[relationship].uselist

                if is_list:

                    container[relationship] = [record.to_dict(depth, include) for record in related]

                else:

                    container[relationship] = related.to_dict(depth, include)

        return container

我已将to_json移至json。您最好有一个基本模型类,它具有to_json方法,从基础模型类继承的所有子类都可以使用此方法。在数据模型类的过程转换实例中可能会出现一些其他问题。我提供的to_json方法是to_dict的简化版。

答案 2 :(得分:0)

您需要在Post模型中为用户设置关系,并编写使用此关系执行连接的查询。

from sqlalchemy.orm import relationship, attributes

class Post(Base):
    ...
    users = relationship("User")


Post.query().options(joinedload(Post.users).load_only('name')).all()

为您的模型实例提供更好的JSON转换。

您可以使用模型继承的to_dictto_json方法定义抽象模型。

还要确保您不会强制加载延迟字段。见__repr__

def __repr__(self):
    fields = []
    for f in self.__table__.columns.keys():
        if f not in attributes.instance_state(self).unloaded:
            fields.append("%s=%s" % (f, getattr(self, f)))
        else:
            fields.append("%s=*" % (f,))

    return "<%s (%s)>" % ', '.join(self.__class__.__name__, fields)

def to_dict(self):
    dct = {}
    for field, value in self.__dict__.items():
        if not field.startswith('_'):
            if isinstance(value, Base):
                dct[field] = value.to_dict()
            else:
                dct[field] = value

    return dct


def to_json(self):
     return json.dumps(
               self.to_dict())