AttributeError: 'list' object has no attribute '_sa_instance_state' Traceback (most recent call last)
AttributeError: 'list' object has no attribute '_sa_instance_state' Traceback (most recent call last)
我正在使用 Postgresql 和 FlaskSqlalchemy。我想创建一个关系,这样一个团队可以有多个频道,但一个频道只能有一个团队(一对多关系)。我试图通过一对多关系来做到这一点,如下所示
我在 models.py
中有以下代码
class Team(db.Model):
__tablename__ = "team"
id = db.Column(db.Integer, primary_key=True)
team_owner_id = db.Column(db.Integer, db.ForeignKey("users.id"), nullable=False)
team_name = db.Column(db.String(50), nullable=False, unique=True)
team_logo = db.Column(db.String(120), default='default.png')
team_description = db.Column(db.String(110), default="Welcome to My team.....")
team_members = db.Column(MutableDict.as_mutable(JSON))
team_members_count = db.Column(db.Integer)
channel_list = db.relationship("Channel", backref="list", lazy=True)
class Channel(db.Model):
channel_id = db.Column(db.Integer, primary_key=True)
team_id = db.Column(db.Integer, db.ForeignKey("team.id"), nullable=False)
channel_name = db.Column(db.String(50), nullable=False, unique=True)
channel_logo = db.Column(db.String(120), default='default.jpg')
channel_description = db.Column(db.String(110), default="Welcome to My Channel.....")
channel_members = db.Column(MutableDict.as_mutable(JSON))
channel_members_count = db.Column(db.Integer)
我可以创建一个团队,但是当我尝试创建一个频道时,除了关系部分之外,一切都很好。我试图通过
使channels_list(backref='list')成为一个列表
list = []
更多代码如下
channel = Channel(channel_name=form.channel_name.data, channel_description =
form.channel_description.data , channel_members = {'member_id': [] , 'name' : []},
channel_members_count=channel_members_count, list = []
)
channel.list.append(form.channel_name.data)
db.session.add(channel)
db.session.commit()
注意:我没有添加一些与此错误无关的代码,例如填充 channel_members 以避免浪费您的时间
现在,当我尝试创建频道时出现错误:
AttributeError: 'dict' object has no attribute '_sa_instance_state'
回溯:[https://i.stack.imgur.com/2XHnl.png[1]
我在哪里犯了错误,或者甚至可以在具有一对多关系的同时存储列表。如果我可以在保持这种关系的同时存储一个 JSON 对象,那将是最好的。感谢您的指导
那么“backref”的意思是它对与给定频道关联的父“团队”的“反向引用”。
因此,例如,如果您在数据库中有一个名为“team_a”的现有团队,并且您想创建一个与此“team_a”关联的新频道。以下是您的操作方式:
new_channel = Channel(channel_info)
# find team with name "team_a"
team = Team.query.filter_by(name="team_a").first()
# associate this team with the new_channel using the backref to the team
# which is called "list"
new_channel.list = team
db.session.add(new_channel)
db.session.commit()
Channel.list
不是列表,它是对与给定频道相关的团队对象的引用。因此,您应该在创建新频道时使用它来将频道与团队相关联。这样,频道将被索引为父团队的子项(或 'many')的一部分。因为有来自团队 -> 频道的 one-to-many。
这使得我们可以使用“团队”对象上的“channel_list”属性 获取与团队关联的所有频道。您不需要直接在团队对象上附加它,只要您在创建频道时将团队与频道相关联即可。
I'd advice you to name the backref as something less confusing on the "teams" table to something like "team" or "parent_team". Like this:
channel_list = db.relationship("Channel", backref="team", lazy=True)
我正在使用 Postgresql 和 FlaskSqlalchemy。我想创建一个关系,这样一个团队可以有多个频道,但一个频道只能有一个团队(一对多关系)。我试图通过一对多关系来做到这一点,如下所示 我在 models.py
中有以下代码class Team(db.Model):
__tablename__ = "team"
id = db.Column(db.Integer, primary_key=True)
team_owner_id = db.Column(db.Integer, db.ForeignKey("users.id"), nullable=False)
team_name = db.Column(db.String(50), nullable=False, unique=True)
team_logo = db.Column(db.String(120), default='default.png')
team_description = db.Column(db.String(110), default="Welcome to My team.....")
team_members = db.Column(MutableDict.as_mutable(JSON))
team_members_count = db.Column(db.Integer)
channel_list = db.relationship("Channel", backref="list", lazy=True)
class Channel(db.Model):
channel_id = db.Column(db.Integer, primary_key=True)
team_id = db.Column(db.Integer, db.ForeignKey("team.id"), nullable=False)
channel_name = db.Column(db.String(50), nullable=False, unique=True)
channel_logo = db.Column(db.String(120), default='default.jpg')
channel_description = db.Column(db.String(110), default="Welcome to My Channel.....")
channel_members = db.Column(MutableDict.as_mutable(JSON))
channel_members_count = db.Column(db.Integer)
我可以创建一个团队,但是当我尝试创建一个频道时,除了关系部分之外,一切都很好。我试图通过
使channels_list(backref='list')成为一个列表list = []
更多代码如下
channel = Channel(channel_name=form.channel_name.data, channel_description =
form.channel_description.data , channel_members = {'member_id': [] , 'name' : []},
channel_members_count=channel_members_count, list = []
)
channel.list.append(form.channel_name.data)
db.session.add(channel)
db.session.commit()
注意:我没有添加一些与此错误无关的代码,例如填充 channel_members 以避免浪费您的时间 现在,当我尝试创建频道时出现错误:
AttributeError: 'dict' object has no attribute '_sa_instance_state'
回溯:[https://i.stack.imgur.com/2XHnl.png[1] 我在哪里犯了错误,或者甚至可以在具有一对多关系的同时存储列表。如果我可以在保持这种关系的同时存储一个 JSON 对象,那将是最好的。感谢您的指导
那么“backref”的意思是它对与给定频道关联的父“团队”的“反向引用”。
因此,例如,如果您在数据库中有一个名为“team_a”的现有团队,并且您想创建一个与此“team_a”关联的新频道。以下是您的操作方式:
new_channel = Channel(channel_info)
# find team with name "team_a"
team = Team.query.filter_by(name="team_a").first()
# associate this team with the new_channel using the backref to the team
# which is called "list"
new_channel.list = team
db.session.add(new_channel)
db.session.commit()
Channel.list
不是列表,它是对与给定频道相关的团队对象的引用。因此,您应该在创建新频道时使用它来将频道与团队相关联。这样,频道将被索引为父团队的子项(或 'many')的一部分。因为有来自团队 -> 频道的 one-to-many。
这使得我们可以使用“团队”对象上的“channel_list”属性 获取与团队关联的所有频道。您不需要直接在团队对象上附加它,只要您在创建频道时将团队与频道相关联即可。
I'd advice you to name the backref as something less confusing on the "teams" table to something like "team" or "parent_team". Like this:
channel_list = db.relationship("Channel", backref="team", lazy=True)