烧瓶关系,仅适用于同一个人的唯一列名称

时间:2017-12-16 15:19:53

标签: python sqlalchemy

我想要的是同一个人不能拥有一个同名的狗,但如果其他所有者可能有同一个狗的名字

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_fran = ['name_pet_1','name_pet_2']< --- correct

pets_larson = ['name_pet_4','name_pet5','name_pet_4']< ---拒绝这个,因为你有两只同名的宠物

pets_pedro = ['name_pet_1','name_pet_6','name_pet_7']< --- pedro和fran的吉祥物具有相同的名称但因为拥有不同的所有者而被录取

1 个答案:

答案 0 :(得分:2)

您可以在Pet表中添加UniqueConstraint

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_id)是唯一的。换句话说,无法添加name和owner_id相同的两个条目。