代码之家  ›  专栏  ›  技术社区  ›  Francisco

烧瓶关系,仅针对同一个人的唯一列名

  •  1
  • Francisco  · 技术社区  · 8 年前

    我想要的是,同一个人不能有同名的狗,但如果其他主人可以有同名的狗

    class Person(db.Model):
        id = db.Column(db.Integer,primary_key=True)
        name = db.Column(db.String(20))
        pets = db.relationship('Pet',backref='person',lazy='dynamic')
    
    class Pet(db.Model):
        id = db.Column(db.Integer,primary_key=True)
        name = db.Column(db.String(20),unique=True)
        owner_id = db.Column(db.Integer,db.ForeignKey('person.id'))
    

    例如,在Person表中有这些名称['fran'、'larson'、'pedro'],其想法是在pets表中可能有3只同名宠物,但绝不会将多只同名宠物与一个人联系在一起,例如

    pets\u fran=['name\u pet\u 1','name\u pet\u 2']<--对的

    pets\u larson=['name\u pet\u 4','name\u pet5','name\u pet\u 4']<--否认这一点,因为你有两个同名的宠物

    pets\u pedro=['name\u pet\u 1','name\u pet\u 6','name\u pet\u 7']<--佩德罗和弗兰的吉祥物名字相同,但因拥有不同的主人而被接纳

    1 回复  |  直到 8 年前
        1
  •  2
  •   willeM_ Van Onsem    8 年前

    您可以添加 UniqueConstraint Pet 表格:

    class Pet(db.Model):
        id = db.Column(db.Integer,primary_key=True)
        name = db.Column(db.String(20),unique=True)
        owner_id = db.Column(db.Integer,db.ForeignKey('person.id'))
    
        __table_args__ = (db.UniqueConstraint('owner_id', 'name'),)

    因此,如果现在使用它来构造表,它将(尝试)强制整个列中的元组(name,owner\u id)是唯一的。因此,换句话说,不能在名称和owner\u id都相同的情况下添加两个条目。