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)