В отношениях SQLAlchemy «один ко многим» кажется, что по умолчанию невозможно связать дублирующиеся дочерние элементы с родителями. Это поведение, которое каждый на самом деле хочет. Например, когда мы запускаем следующий код:
class Child(db.Model):
__tablename__ = 'child'
id = db.Column(db.Integer(), primary_key=True)
name = db.Column(db.String(50) )
age = db.Column(db.Integer())
parent_id = db.Column(db.Integer, db.ForeignKey('parent.id', ondelete='CASCADE'))
class Parent(db.Model):
__tablename__ = 'parent'
id = db.Column(db.Integer(), primary_key=True)
name = db.Column(db.String(50) )
children = db.relationship("Child", backref='parent', cascade='all')
p = Parent()
p.name="Pop"
c = Child()
c.name = "Junior"
p.children.append(c)
p.children.append(c)
db.session.add(p)
db.session.commit()
К счастью, только одна дочерняя запись добавляется в базу данных!
Однако мой вопрос: где это явно задокументировано в документации по SQLAlchemy?
(Это должно быть задокументировано явно, поскольку это противоречит стандартному поведению Python - по умолчанию можно добавлять дубликаты объектов в список. Например:
class MyClass:
x = 5
my_obj = MyClass()
myList = []
myList.append(my_obj)
myList.append(my_obj)
for x in myList:
print(x) # prints the object out twice
)