Как я могу прикрепить общий `Контакт` к нескольким различным таблицам? - PullRequest
0 голосов
/ 15 февраля 2019

Я пытаюсь создать набор таблиц, которым можно назначить Contact.

class Contact(Base):
    __tablename__ = "contact"
    id = Column(Integer, primary_key=True)
    name = Column(String, index=True, nullable=False, doc="Name of the contact.")
    phone = Column(String, index=True, doc="Phone number of the contact.")

Контакты могут быть связаны с различными другими таблицами, и одна запись может иметь большечем один контакт в разных областях.

class BusinessGroup(Base):
    __tablename__ = "business_group"
    id = Column(Integer, primary_key=True)
    name = Column(String, index=True, nullable=False, doc="Name of the group.")
    main_contact = Column(Integer, ForeignKey("contact.id"), doc="Main contact details for the group.")
    second_contact = Column(Integer, ForeignKey("contact.id"), doc="Second contact details for the group.")

class Vendor(Base):
    __tablename__ = "vendor"
    id = Column(Integer, primary_key=True)
    name = Column(String, index=True, nullable=False, doc="Name of the vendor.")
    contact = Column(Integer, ForeignKey("contact.id"), doc="Main contact details for the vendor.")

Эта настройка работает, но в flask-admin поля контактов не отображаются при создании нового элемента для BusinessGroup или Vendor.

Как я могу заставить этот дизайн работать?Или я должен моделировать такие отношения совсем по-другому?

1 Ответ

0 голосов
/ 24 февраля 2019

Я закончил создание подкласса таблицы Contact, чтобы у меня могло быть:

class MainContact(Contact):
    __tablename__ = "main_contact"
    id = Column(Integer, ForeignKey("contact.id"), primary_key=True)
    business_group = relationship("BusinessGroup", back_populates="main_contact")
    business_group_id = Column(Integer, ForeignKey("business_group.id"), nullable=False)
    ...

class SecondContact(Contact):
    __tablename__ = "second_contact"
    id = Column(Integer, ForeignKey("contact.id"), primary_key=True)
    business_group = relationship("BusinessGroup", back_populates="second_contact")
    business_group_id = Column(Integer, ForeignKey("business_group.id"), nullable=False)
    ...

class BusinessGroup(Base):
    __tablename__ = "business_group"
    id = Column(Integer, primary_key=True)
    name = Column(String, index=True, nullable=False, doc="Name of the group.")
    main_contact = relationship(
        "MainContact", back_populates="business_group", uselist=False, 
        doc="Main contact details for the business_group."
    )
    second_contact = relationship(
        "SecondContact", back_populates="business_group", uselist=False, 
        doc="Second contact details for the business_group."
    )

Так же как и требование создания подклассов, чтобы мы могли иметь два разных контакта, относящихся к одной и той же модели, другой важныйчасть добавляла связи внешнего ключа, чтобы контакты отображались на панели администрирования Flask.

...