我有以下注册表:
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 对象没有该属性。
如何解决这个错误?
我认为如果您使用表对象,您需要这里的大写类,即。
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
未映射到类,因此使用表对象。