8 votes

Flask SQLAlchemy - StaticMethod vs Classe d'interrogation personnalisée

J'ai un Event Modèle avec les deux start_date et due_date colonnes. Je veux créer un moyen facile d'obtenir tous les événements actifs (qui ont déjà été commencés mais pas encore terminés).

C'est ma classe de modèle d'événement :

class Event(db.Model):
    __tablename__ = 'events'
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(254))
    description = db.Column(db.Text)
    start_date = db.Column(db.DateTime)
    due_date = db.Column(db.DateTime)

Je connais deux solutions efficaces pour répondre à ce besoin :

1 : Avec un staticmethod qui effectuera tous les filtres sur l'objet Event.query et renverra une liste complète des événements actifs.

class Event(BaseModel):
    ...
    @staticmethod
    def get_active():
         return Event.query.filter(...).all()

# Usage:
records = Event.get_active()

2 : En créant un nouvel objet requête qui hérite de BaseQuery et affectez cette nouvelle classe "EventQuery" à la classe de modèle query_class membre.

class EventQuery(BaseQuery):
    def get_active(self):
        return self.filter(...)

class Event(BaseModel):
    __tablename__ = 'events'
    query_class = EventQuery
    ....

# Usage:
Event.query.get_active().all()

Je me demande donc quelle méthode est la meilleure/la plus recommandée ?

4voto

swehren Points 546

Pour un simple exemple isolé, je ne pense pas que cela ait beaucoup d'importance. Pour les cas plus complexes et plus importants, l'option 2 offre une flexibilité supplémentaire pour combiner votre filtre avec d'autres filtres.

Event.query.filter_by(user_id=1).get_active().all()

Il est vrai que vous pourriez modifier l'option 1 de manière à ce qu'elle prenne une requête comme argument et renvoie une nouvelle requête, mais alors elle commencerait à avoir une apparence assez différente des requêtes SQLAlchemy typiques.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X