Я использую Python 2.7 с sqlAlchemy поверх sqllite, в приложении для колб и пытаюсь отобразить отношения между двумя моделями, модели Lad и Crew, у Lad может быть много экипажей и наоборот, единственное ограничение заключается в том, чтопара должна быть уникальной, например, парень может быть в команде только один раз, и наоборот, я построил модели, и при попытке добавить команду к одному парню дважды, ограничение первичного ключа ограничивает меня, но когдапытаясь добавить одного и того же парня в команду дважды, это позволяет мне, что также должно быть запрещено.
peopleInCrews = Table("peopleInCrewsAssosiation", Base.metadata,
Column("A", Integer, ForeignKey("lads.id", ondelete="CASCADE", onupdate="CASCADE"), primary_key=True),
Column("B", Integer, ForeignKey("crews.id", ondelete="CASCADE", onupdate="CASCADE"), primary_key=True),
PrimaryKeyConstraint("A", "B"))
class Lad(Base):
__tablename__ = 'lads'
id = Column(Integer, primary_key=True, autoincrement=True)
firstName = Column(String(50), unique=False)
lastName = Column(String(50), unique=False)
crews = relationship("Crew", secondary=peopleInCrews, back_populates="lads")
class Crew(Base):
__tablename__ = 'crews'
id = Column(Integer, primary_key=True, autoincrement=True)
name = Column(String(20), unique=False)
lads = relationship("Lad", secondary = peopleInCrews, back_populates = "crews")#, cascade = "all, delete")
Когда я начну с создания парня и команды следующим образом:
c = Crew("name")
l = Lad("first", "last")
Следующий код выдает повторяющуюся ошибку, как и должно быть:
c.lads.append(lad)
c.lads.append(lad)
Ожидается, что следующий код сделает то же самое, но просто добавит парня дважды в crew.lads:
l.crews.append(c)
l.crews.append(c)
Что мне здесь не хватает?
Редактировать: Некоторые предположили, что этот вопрос похож на этот . Что здесь отличается, так это то, что я использую primaryKeyConstraint и что он работает в одном направлении, а не в другом направлении,Например, вы можете добавить одну и ту же команду дважды в Lad.crews, но вы не можете добавить одного и того же парня в Crew.lads.он должен быть симметричным уникальным ограничением и работать одинаково в обоих направлениях.