问题描述
我一直在控制台上不断收到警告,我读了多少书都快疯了,但我一直没能解决这个问题:
SAWarning:关系 'Book.users' 会将列 user.uid 复制到列 user_book.uid,这与关系:'User.books'(将 user.uid 复制到 user_book.uid)冲突。如果这不是故意的,请考虑这些关系是否应该与 back_populates 链接,或者如果 viewonly=True 应该应用于一个或多个,如果它们是只读的。对于外键约束部分重叠的不太常见的情况,orm.foreign() 注释可用于隔离应写入的列。 'overlaps' 参数可用于删除此警告。
控制台在本通知中引用的表格如下:
user_book = db.Table('user_book',db.Column('uid',db.Integer,db.ForeignKey('user.uid'),primary_key=True),db.Column('bid',db.Text,db.ForeignKey('book.bid'),db.Column('date_added',db.DateTime(timezone=True),server_default=db.func.Now())
)
class User(db.Model):
__tablename__ = 'user'
uid = db.Column(db.Integer,primary_key=True)
email = db.Column(db.String(25),nullable=False)
hash = db.Column(db.String(),nullable=False)
first_name = db.Column(db.String(30),nullable=True)
last_name = db.Column(db.String(80),nullable=True)
books = db.relationship('Book',secondary=user_book)
class Book(db.Model):
__tablename__ = 'book'
bid = db.Column(db.Text,primary_key=True)
title = db.Column(db.Text,nullable=False)
authors = db.Column(db.Text,nullable=False)
thumbnail = db.Column(db.Text,nullable=True)
users = db.relationship('User',secondary=user_book)
我使用 user_book table
向用户展示他添加的书籍。
我错过了什么?借此机会问一下,表和外键的关系在语义上做对了吗?
解决方法
正如警告消息所暗示的那样,您的关系中缺少 back_populates=
属性:
class User(db.Model):
# …
books = db.relationship('Book',secondary=user_book,back_populates="users")
# …
class Book(db.Model):
# …
users = db.relationship('User',back_populates="books")
# …