2010-05-19 7 views
3

Vous ne savez pas quel devrait être le bon titre pour cette question. J'ai le schéma suivant:Comment spécifier une relation dans SQLAlchemy où une condition requiert une colonne null?

  • Les sujets ont une relation un-plusieurs à WorkItems.
  • Les éléments de travail ont une relation one-one (ou un-zéro) avec LineItems.

Je suis en train de créer la relation entre les questions et WorkItems

Matter.unbilled_work_items = orm.relation(WorkItem, 
    primaryjoin = (Matter.id == WorkItem.matter_id) and (WorkItem.line_item_id == None), 
    foreign_keys = [WorkItem.matter_id, WorkItem.line_item_id], 
    viewonly=True 
) 

Ce Lancers:

AttributeError: '_Null' object has no attribute 'table' 

Cela semble dire que la deuxième clause du primaryjoin retourne un objet de type _Null, mais il semble s'attendre à quelque chose avec un attribut "table".

Cela semble être assez simple pour moi, est-ce que je manque quelque chose d'évident?

Mise à jour

La réponse est de changer la ligne primaryjoin à:

primaryjoin = "and_(Matter.id == WorkItem.matter_id, WorkItem.line_item_id == None)" 

Répondre

5

Essayez d'utiliser and_ comme and n'est pas surchargée:

and_((Matter.id == WorkItem.matter_id), (WorkItem.line_item_id == None)) 
+1

Le '' et l'opérateur est surchargé, vous pouvez aussi écrire (...) et (...) – codeape

+0

Le problème avec et est qu'il se lie plus forte que ==. Donc 'x == 'a' & y == 'b'' deviendrait' (x == (' a '& y)) ==' b'' – ThiefMaster

+0

Oui, c'est pourquoi vous avez besoin de la parenthèse: '(x == 'a') & (y == 'b')' – codeape

1

En dehors de la question _Null, cela nécessite une jointure externe gauche pour faire correctement. J'ai décidé que unbilled_work_items devrait être une propriété qui exécute une requête et renvoie le résultat.

# like this 

@property 
def unbilled_work_items(self): 
    return Session.object_session(self).query.filter(...).all() 
Questions connexes