想象一下我有 2 张表Person
和Group
.这两个表之间存在关系。Person
具有nickname
,并且该nickname
需要在Person
链接到的Group
中是唯一的。我将如何为Person
表编写validate_nickname
?
我想收集属于要添加的Person
所属Group
的每个Person
nickname
,并验证正在添加的nickname
是否已存在。我只是不确定如何查询每个Person
,因为我无法访问validate_nickname
内部的任何SQLAlchemy.Session
。
小玩具示例:
from sqlalchemy.orm import validates, relationship
class Group(Base):
__tablename__ = 'group'
id = Column(Integer, primary_key=True)
name = Column(String)
class Person(Base):
__tablename__ = 'person'
id = Column(Integer, primary_key=True)
name = Column(String)
nickname = Column(String)
group = relationship("Group", uselist=False)
@validates('nickname')
def validate_nickname(self, key, nickname):
# collect nickname from every Person with group == group of person being added
# check if nickname of person being added does not exist in list generated above
# raise an exception in case the nickname already exists
return address
感谢@IljaEverilä的回答。我在Person
中添加了一个group_id
外键(我忘了在示例中添加(,并添加了一个具有group_id
和name
的 UniqueConstraint 来__table_args__
。
from sqlalchemy.orm import validates, relationship
from sqlalchemy.schema import UniqueConstraint
class Group(Base):
__tablename__ = 'group'
id = Column(Integer, primary_key=True)
name = Column(String)
class Person(Base):
__tablename__ = 'person'
__table_args__ = (
UniqueConstraint('group_id', 'nickname', name='_group_id_nickname_uc'),
)
id = Column(Integer, primary_key=True)
name = Column(String)
nickname = Column(String)
group_id = Column(Integer, ForeignKey('group.id'))
group = relationship("Group")