我在SqlAlchemy中有两个模型,它们之间具有外键关系。我需要的是,当我得到一个passthrough
的对象作为json时,它也应该包含Post
模型的一些预定义列。
就像在这种情况下一样,我需要将User
模型的名称列与User
对象一起返回。
我试图在Post
模型中添加一个json属性,但它只返回模型。
Post
答案 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()
您可以使用模型继承的to_dict
和to_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())