2015-11-23 17 views
5

Aşağıdaki nesneleri ve ilişkileri tanımladım. Bu aslında oldukça basit bir durumdur ve inhalasyon ve enjeksiyon anestezisinin neden iki farklı sınıf tarafından tanımlanacağına inandığımı göstermek için tüm bu alanları sağlıyorum.çoklu/bölünmüş sınıf ilişkileri

class InhalationAnesthesia(Base): 
    __tablename__ = "inhalation_anesthesias" 
    id = Column(Integer, primary_key=True) 
    anesthetic = Column(String) 
    concentration = Column(Float) 
    concentration_unit = Column(String) 
    duration = Column(Float) 
    duration_unit = Column(String) 


class TwoStepInjectionAnesthesia(Base): 
    __tablename__ = "twostep_injection_anesthesias" 
    id = Column(Integer, primary_key=True) 
    anesthetic = Column(String) 
    solution_concentration = Column(Float) 
    solution_concentration_unit = Column(String) 
    primary_dose = Column(Float) 
    primary_rate = Column(Float) 
    primary_rate_unit = Column(String) 
    secondary_rate = Column(Float) 
    secondary_rate_unit = Column(String) 

class Operation(Base): 
    __tablename__ = "operations" 
    id = Column(Integer, primary_key=True) 
    anesthesia_id = Column(Integer, ForeignKey('inhalation_anesthesias.id')) 
    anesthesia = relationship("InhalationAnesthesia", backref="used_in_operations") 

Ben, ancak, herhangi bir Operation amacı TwoStepInjectionAnesthesia nesne veya bir nesne InhalationAnesthesia ya işaret edebilir şekilde Operation sınıfının anestezik özelliği tanımlamak istiyoruz.

Bunu nasıl yapabilirim?

cevap

6

Kaliteyi kullanmanızı öneririm. Çok, çok iyi here ve here

Benim tavsiye bir Anesthesia sınıf oluşturmak ve ondan hem InhalationAnesthesia ve TwoStepInjectionAnesthesia kaynaklanan devralma yapmaktır sqlalchemy dokümanlarında anlatılmış. Bu tablo devralma kullanımının hangi tip karar vermek senin kararın:

  • tek tablo devralma
  • beton masa miras
  • katıldı tablo devralma

miras en yaygın formları tek ve Birleştirilmiş tablo, , beton kalıtım daha yapısal zorluklar sunar.

davanızı için

Ben darlık ediyorum tablo devralma seçimler olacak katıldı:

class Anesthesia(Base) 
    __tablename__ = 'anesthesias' 
    id = Column(Integer, primary_key=True) 
    anesthetic = Column(String) 
    # ... 
    # every common field goes here 
    # ... 
    discriminator = Column('type', String(50)) 
    __mapper_args__ = {'polymorphic_on': discriminator} 

discriminator alanın amacı:

... hareket etmek Ayrımcı olarak ve satırında temsil edilen nesnenin türünü belirten bir değer depolar. Sütun herhangi bir veri türünde olabilir, ancak dize ve tamsayı en yaygın olan 'dur.

__mapper_args__ sitesindeki polymorphic_on temel ayırdetme gibi olan alan kullanımını tanımlar. Çocuk sınıflarında (aşağıda), polimorfik_hesimliliği anahtarı, sınıfın örnekleri için polimorfik ayırımcı sütununda depolanacak değeri tanımlar.

class InhalationAnesthesia(Anesthesia): 
    __tablename__ = 'inhalation_anesthesias' 
    __mapper_args__ = {'polymorphic_identity': 'inhalation'} 
    id = Column(Integer, ForeignKey('anesthesias.id'), primary_key=True) 
    # ... 
    # specific fields definition 
    # ... 


class TwoStepInjectionAnesthesia(Anesthesia): 
    __tablename__ = 'twostep_injection_anesthesias' 
    __mapper_args__ = {'polymorphic_identity': 'twostep_injection'} 
    id = Column(Integer, ForeignKey('anesthesias.id'), primary_key=True) 
    # ... 
    # specific fields definition 
    # ... 

Nihayet Operation sınıf tipik bir ilişkiyle üst tablo Anesthesia referans verebilir:

class Operation(Base): 
    __tablename__ = 'operations' 
    id = Column(Integer, primary_key=True) 
    anesthesia_id = Column(Integer, ForeignKey('anesthesias.id')) 
    anesthesia = relationship('Anesthesia', backref='used_in_operations') 

Umut bu aradığınız budur.

+0

Bu nedenle, "Operation.anesthesia" altındaki "InhalationAnesthesia" ve "TwoStepInjectionAnesthesia" nesnelerine bakabilmem gerekir. Operation.anesthesia = [TwoStepInjectionAnesthesia (..), InhalationAnesthesia (..), Inhalationanesthesia (..)] 'yı kullanır mı? – TheChymera

+0

@ TheChymera Evet ve Evet. Sağlanan örnekte, bir "İşlem" örneği yalnızca bir "Anestezi" nesnesine referans gösterecektir. Listeye ihtiyacınız varsa, kodu biraz değiştirmelisiniz. –

+0

Bir şey daha, yukarıdaki kurulumu kullanmanın avantajı nedir (python sonunda biraz daha iyi organize edilmekten başka)? Oluşturulacak gerçek sql tablosu, yalnızca belirli uyum sağlayıcılara sahip satırlar için belirli sütun türlerini içerir mi? (böylece disk alanı kaydediliyor mu?) – TheChymera

İlgili konular