le 25.06.2007 21:58 Gaetan de Menten a écrit:
> Well... If it was so simple, I'd have done it already. As I said, you
> need to take into account tthe args and kwargs defined on the inverse
> (and also prevent that inverse to setup the property too). I'll have a
> look at the test thing tomorrow.
>
>
Gaetan,
Here is my second version. I made the changes to do plain "backref"
calls. It passes all the tests (as I sent last time)
Here is the patch, I think it looks like more to what you were looking for :
Index: elixir/relationships.py
===================================================================
--- elixir/relationships.py (révision 135)
+++ elixir/relationships.py (copie de travail)
@@ -190,7 +190,7 @@
'''
from sqlalchemy import relation, ForeignKeyConstraint, Column, \
- Table, and_
+ Table, and_, backref
from elixir.statements import Statement
from elixir.fields import Field
from elixir.entity import EntityDescriptor
@@ -205,6 +205,8 @@
'''
def __init__(self, entity, name, *args, **kwargs):
+ print self.__class__.__name__, "init", args, kwargs
+
self.entity = entity
self.name = name
self.of_kind = kwargs.pop('of_kind')
@@ -218,6 +220,9 @@
#TODO: unused for now
self.args = args
self.kwargs = kwargs
+
+ self._backrefs = dict() # to handle backref definitions
+ self._setup_done = False
self.entity._descriptor.relationships[self.name] = self
@@ -243,13 +248,17 @@
'''
Sets up the relationship, creates foreign keys and secondary
tables.
'''
-
+
if not self.target:
return False
if self.property:
return True
+ if self._setup_done:
+ return True
+ self._setup_done = True
+
self.create_keys()
self.create_tables()
self.create_properties()
@@ -447,7 +456,16 @@
if self.primaryjoin_clauses:
kwargs['primaryjoin'] = and_(*self.primaryjoin_clauses)
kwargs['uselist'] = False
-
+
+ if self.inverse:
+ # check if backref is already defined on the other side
+ if self.inverse._backrefs.get(self.inverse.name, None):
+ kwargs['backref'] =
self.inverse._backrefs[self.inverse.name]
+ else:
+ # define backref for further use
+ self._backrefs[self.name] = backref(self.name, **kwargs)
+ return
+
self.property = relation(self.target, **kwargs)
self.entity.mapper.add_property(self.name, self.property)
@@ -488,8 +506,14 @@
kwargs['uselist'] = self.uselist
- self.property = relation(self.target, **kwargs)
- self.entity.mapper.add_property(self.name, self.property)
+ # has_one and has_many always have inverse...
+ if self.inverse._backrefs.get(self.inverse.name, None):
+ kwargs['backref'] = self.inverse._backrefs[self.inverse.name]
+ self.property = relation(self.target, **kwargs)
+ self.entity.mapper.add_property(self.name, self.property)
+ else:
+ # define backref for further use
+ self._backrefs[self.name] = backref(self.name, **kwargs)
class HasMany(HasOne):
@@ -517,7 +541,7 @@
self.secondary_table = None
self.primaryjoin_clauses = list()
self.secondaryjoin_clauses = list()
- super(HasAndBelongsToMany, self).__init__(entity, name,
+ super(HasAndBelongsToMany, self).__init__(entity, name,
*args, **kwargs)
def create_tables(self):
@@ -660,6 +684,15 @@
kwargs['order_by'] = \
self.target._descriptor.translate_order_by(kwargs['order_by'])
+ if self.inverse:
+ # check if backref is already defined on the other side
+ if self.inverse._backrefs.get(self.inverse.name, None):
+ kwargs['backref'] =
self.inverse._backrefs[self.inverse.name]
+ else:
+ # define backref for further use
+ self._backrefs[self.name] = backref(self.name, **kwargs)
+ return
+
self.property = relation(self.target,
secondary=self.secondary_table,
uselist=True, **kwargs)
self.entity.mapper.add_property(self.name, self.property)
--------------------------------------------------------------
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"SQLElixir" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at
http://groups.google.com/group/sqlelixir?hl=en
-~----------~----~----~----~------~----~------~--~---