2012-06-12 3 views
2

J'utilise SQLAlchemy sous Flask. J'ai une table qui représente un mode dans lequel mon système peut être. J'ai aussi une table qui contient des listes d'élévations qui sont applicables à chaque mode. (Donc, c'est une relation plusieurs-à-plusieurs.) Dans le passé, quand j'ai ajouté un attribut (comme elevations ici ScanModes ici) à une classe mappée à une table, la cible était aussi une classe.Comment créer une relation avec une valeur sans classe dans SQLAlchemy?

-t-il plus judicieux d'envelopper les élévations dans une classe (et faire une table correspondante?) Donc je peux utiliser relationship pour faire ScanModes.elevations travail, ou devrais-je utiliser un query-enabled property? Je suis également ouvert à d'autres suggestions.

elevation_mode_table = db.Table('elevation_mode', db.metadata, 
           db.Column('scan_mode', db.String, 
              db.ForeignKey('scan_modes'), 
              nullable=False), 
           db.Column('elevation', db.Float, 
              nullable=False), 
           db.PrimaryKeyConstraint('scan_mode', 
                 'elevation')) 

class ScanModes(db.Model): 
    scan_mode = db.Column(db.String, primary_key=True) 
    elevations = ? 

    def __init__(self, scan_mode): 
     self.scan_mode = scan_mode 

Répondre

3

l'approche la plus simple serait de carte juste elevation_mode_table à une classe:

from sqlalchemy.orm import mapper 
class ElevationMode(object): 
    pass 

mapper(ElevationMode, elevation_mode_table) 

class ScanModes(db.Model): 
    elevations = relationship(ElevationMode) 

bien sûr encore plus facile est d'avoir juste ElevationMode être une classe déclarée en premier lieu, si vous avez besoin Traiter avec elevation_mode_table vous obtiendriez cela de ElevationMode.__table__ ...

L'idée "query enabled property" ici, bien sûr que vous pourriez le faire aussi bien que vous perdiez les avantages de la relation de mise en cache.

+0

Merci. Je vais essayer ça dans la matinée. J'apprécie vraiment que vous venez sur le site et que vous souteniez les gens avec la bibliothèque! –

+0

Je pense que ce n'est pas tout à fait ce que je cherchais; peut-être que ce que je veux n'est pas "SQLAlchemic" assez. J'imaginais que l'attribut 'elevations' pourrait simplement être une liste non dépliée de valeurs tirées de' elevation_mode_table'. Je suppose que la mise en cache est faite à l'intérieur de l'objet 'ElevationMode' ici, et c'est pourquoi c'est nécessaire? –

+0

En ce moment, je peux réaliser la mise en cache et mon attribut comme une liste avec votre code (avec 'elevations' renommé' _elevations') plus en faisant 'elevations' une propriété dont getter retourne une liste extraite de l'attribut' _elevations'. –

Questions connexes