6

J'essaie d'obtenir des instances d'une classe filtrée par un champ qui est une clé étrangère mais quand j'essaie de faire cela, j'obtiens toujours toutes les entrées dans la base de données, au lieu de ceux qui correspondent au critère. Disons que j'ai quelques classes utilisant une base déclarative dans une relation simple N: 1. Je que modélisé comme:SqlAlchemy - Filtrage par champ défini comme ForeignKey

#!/usr/bin/python2.6 
class ContainerClass(declarativeBase): 
    __tablename__ = "container_classes" 
    _id = Column("id", Integer, primary_key=True) 
    id = sqlalchemy.orm.synonym('_id', descriptor=property(getId, setId)) 


class WhateverClass(declarativeBase): 
    __tablename__ = "whatever_classes" 

    _id = Column("id", Integer, primary_key=True) 
    _total = Column("total", Integer) 
    _containerClassId = Column("container_class_id", Integer, ForeignKey("other_classes.id")) 

    _containerClass = relationship("ContainerClass", uselist=False) 

    id = sqlalchemy.orm.synonym('_id', descriptor=property(getId, setId)) 
    total = sqlalchemy.orm.synonym('_total', descriptor=property(getTotal, setTotal)) 
    containerClassId = sqlalchemy.orm.synonym('_containerClassId', decriptor=property(getContainerClassId, setContainerClassId)) 
    containerClass = sqlalchemy.orm.synonym('_containerClass', descriptor=property(getContainerClass setContainerClass)) 

Une instance de « WhateverClass » peut appartenir à une instance de « ContainerClass » (et chaque ContainerClass peut avoir plusieurs instances de WhateverClass). La relation semble fonctionner correctement. Si j'ajoute un nouveau "WhateverClass" à un "ContainerClass", le quelquechoseClass.containerClassId obtient correctement la valeur de ContainerClass à laquelle il appartient. Mais disons que je dois obtenir une liste d'instances de "WhateverClass" appartenant à la classe "ContainerClass" dont l'identifiant est == 5.

Si je tente de faire:

from myClasses import WhateverClass 
session.query(WhateverClass.WhateverClass).filter(WhateverClass.WhateverClass.containerClass.id == 5).all() 

Je reçois toutes les instances de WhateverClass qui sont stockés dans la base de données, non seulement ceux qui sont liés à l'ContainerClass avec id == 5

Mais si je le fais session.query (WhateverClass.WhateverClass) .filter (total < = 100) .all() Je reçois correctement des instances de WhateverClass dont le champ "total" est < = 100. Je suis assez novice pour sqlalchemy ... Dois-je utiliser une requête jointe ou quelque chose comme ça? Je sais que cela ne peut pas être compliqué, mais je n'ai pas trouvé de solution appropriée. J'ai essayé des jointures, des syndicats ... Mais (évidemment) je fais quelque chose de mal.

J'utilise sqlalchemy 0.6.6 et Python 2.6 (juste au cas où il est pertinent)

Merci à l'avance!

Répondre

10

Pour une requête simple, il vous suffit d'interroger directement:

session.query(WhateverClass).filter(WhateverClass._containerClassId == 5).all() 

Pour des relations plus complexes, vous avez besoin d'une jointure:

session.query(WhateverClass).join(ContainerClass).filter(ContainerClass.id == 5).all() 
+0

je reçois un comportement bizarre avec cette solution. Je reçois toujours toutes les instances de "WhateverClass" que j'ai dans la base de données, mais si je publie le quelquechoseInstance.containerClassId, il dit "5" pour tous. Mais ce n'est pas vrai ... Seules quelques unes de WhateverClass (es) ont un containerClassId == 5 (comme 3 d'entre elles sur 300 ... J'obtiens les 300 instances, et, en fonction de la sortie, les 300 ont un whateverClassInstance .containerClassId == 5 ... mais ce n'est pas ce que dit le navigateur de requêtes MySQL). Merci pour votre aide, cependant. – BorrajaX

+1

Mise à jour: Je suis stupide ... Dumb, muet, stupide ... Je suis allé à travers tous les enregistrements dans ma base de données et il se avère que j'avais beaucoup plus WhateverClass dans le ContainerClass avec id == 5 que je pensais !! ! Ça fonctionnait de gecko! Merci encore... – BorrajaX

Questions connexes