Sql Alchemy 在指定类而不是表时说表没有属性

问题描述 投票:0回答:1

我有以下注册表:

class RegistrationForm(FlaskForm):
  # Fields
  name             = StringField("Name",validators               = [DataRequired(),Length(max = 64)])
  username         = StringField("Username",validators           = [DataRequired(),Length(max = 64)])
  email            = StringField("Email",validators              = [DataRequired(),Email(),Length(max = 120)])
  password         = PasswordField("Password",validators         = [DataRequired(),Length(min = 8,max = 255)])
  confirm_password = PasswordField("Confirm Password",validators = [DataRequired(),EqualTo("password")])
  submit           = SubmitField("Sign Up")
  # Custom Validators
  def validate_username(self,username):
    if (db.session.scalar(sa.select(User).where(User.username == username.data))) is not None:
      raise ValidationError(f"The username {username.data} is already taken. Please choose a different one.")
  
  def validate_email(self,email):
    if (db.session.scalar(sa.select(User).where(User.email == email.data))) is not None:
      raise ValidationError(f"The email {email.data} is already taken. Please choose a different one.")

用户模型所在:

class User(db.Model,UserMixin):
  # Table name
  __tablename__ = "user"
  # Columns
  user_id       : so.Mapped[int]   = so.mapped_column(primary_key = True)
  name          : so.Mapped[str]   = so.mapped_column(sa.String(64),nullable = False)
  username      : so.Mapped[str]   = so.mapped_column(sa.String(64),index = True,unique = True,nullable = False)
  email         : so.Mapped[str]   = so.mapped_column(sa.String(120),index = True,unique = True,nullable = False)
  password_hash : so.Mapped[str]   = so.mapped_column(sa.String(256),nullable = False)
  max_quota     : so.Mapped[float] = so.mapped_column(sa.Float,nullable = False)
  curr_quota    : so.Mapped[float] = so.mapped_column(sa.Float,nullable = False)
  # Relationships
  job : so.WriteOnlyMapped["Job"] = so.relationship("Job",back_populates = "user",primaryjoin = "user.user_id == job.user_id")
  # Representation
  def __repr__(self):
    return f"User {self.username} - (name : {self.name}, username : {self.username}, email : {self.email}, max_quota : {self.max_quota}, curr_quota : {self.curr_quota})"

我在

AttributeError: 'Table' object has no attribute 'user_id'
函数中收到错误
validate_username
,但我不明白为什么。我总是使用名称
User,
对应于类,而不是表,所以为什么说 Table 对象没有该属性。

如何解决这个错误?

python flask sqlalchemy
1个回答
0
投票

我认为如果您使用表对象,您需要这里的大写类,即。

user
那么你需要使用像
user.c.user_id
这样的列属性,即。
user.c.user_id == job.c.user_id

    so.relationship("Job",back_populates = "user",primaryjoin = "User.user_id == Job.user_id")

老实说,我无法在文档中找到一个很好的差异示例。它可能在那里,但我找不到它。

尽管如果你看这里自引用多对多关系你可以看到一个primaryjoin的例子,它同时涉及类评估和后期表评估,即。

primaryjoin="Node.id==node_to_node.c.left_node_id",
。在这种情况下,表
node_to_node
未映射到类,因此使用表对象。

© www.soinside.com 2019 - 2024. All rights reserved.