SQL Alchemy 用户<> 客户关系,多对一,返回错误的值



我正试图为一个数据库模型创建一个多对一关系,在该模型中,一个客户下可以存在多个用户。

我的代码都在应用程序中工作,但最近我意识到,当我添加新的用户记录时,关系会根据关系返回错误的客户记录。

class User(db.Model):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
customer_id = Column(Integer, ForeignKey('customer.id'),default=None)
aws_sub = Column(String(50),unique=True)
email = Column(String(120), unique=True)
status = Column(Boolean, unique=False,default=False)
access_token = Column(String(2500))
refresh_token = Column(String(2500))
id_token = Column(String(2500))
resend_code = Column(String(32))
date_created = Column(DateTime(timezone=True), server_default=func.now())
date_updated = Column(DateTime(timezone=True), onupdate=func.now())

customer = relationship("Customer", uselist=False, back_populates="users",foreign_keys=[customer_id],remote_side=customer_id)

class Customer(db.Model):
__tablename__ = 'customer'
id = Column(Integer, primary_key=True)
name = Column(String(50), unique=True)
#False is trial account
status = Column(Boolean, unique=False,default=False)
#primary_user = Column(Integer, ForeignKey('users.id'), unique=True)
date_created = Column(DateTime(timezone=True), server_default=func.now())
date_updated = Column(DateTime(timezone=True), onupdate=func.now())
setup_complete = Column(Boolean, unique=False,default=False)
setup_step = Column(Integer, default=1)
users = relationship("User", uselist=False, back_populates="customer")
tickets = relationship("Ticket", uselist=False, back_populates="customer")
api = relationship("API", backref="Customer")

我在数据库中有两个用户与此模型一起存储,当我尝试检索第二个用户记录上的记录时,该记录没有customer_id集(NULL(,它错误地检索了第一个用户的customer_id 1。客户表中只有一条记录,对应于第一个用户。第二个用户没有关联的客户记录。用户的客户关系不应该返回null或None吗?

我试图避免初始化数据中不需要的部分,直到它们是必要的,所以逻辑只有在预期数据的情况下才起作用,否则它将隐含地失败。我需要用户和客户的原因是,我希望我的应用程序最终支持多个用户帐户,但最初大多数用户帐户将绑定到一个"帐户";客户";或公司账户。

我使用current_user.customer是我使用Flask和Flask登录的一些视图,所以我想确保我的视图处理空情况或";关系尚未建立";。

用户数据:

aws_sub访问_token刷新_tokenxxxq34q34txxx
idcustomer_id电子邮件状态
1第34季度第34季度jandoe@yahoo.comzzzyyyxxxx2021-05-20 04:27:012021:05-30 14:37:04
2jsmith@yahoo.comxxxxxyyyzzz2021-06-04 16:50:002021:06-04 16:50:46

我解决了这个问题。我在模型的两侧传递back_populates,因为这是一种双向多对一(User>Customer(关系。然而,您似乎可以通过使用backref从一侧指定关系来做到这一点,在这种情况下:

class Customer(db.Model):
__tablename__ = 'customer'
....
users = relationship("User", uselist=False, backref="customer")

我注释掉了我在多方(用户模型(中的现有关系,如果该用户的customer_id为null,那么current_user.customer现在返回null。我记得在某个地方看到过后台人口更新的地方,所以我想我认为它是首选。。。

最新更新