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

2024-05-18 15:46:52 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有两个表PersonGroup。这两个表之间存在关系。一个Person有一个nickname,并且nickname需要在Person链接到的Group中是唯一的。如何为Person表编写validate_nickname?你知道吗

我想收集属于被添加的Person所属的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

Tags: keyfrombasestringgroupnicknamecolumnvalidate
1条回答
网友
1楼 · 发布于 2024-05-18 15:46:52

感谢@IljaEverilä的回答。我向Person添加了一个group_id外键(在示例中我忘了添加这个外键),并向__table_args__添加了一个带有group_idname的UniqueConstraint。你知道吗

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")

相关问题 更多 >

    热门问题