如何使用 sql.alchemy.orm.validates 使用来自不同表的信息验证表字段



想象一下我有 2 张表PersonGroup .这两个表之间存在关系。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_idname的 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")

最新更新