2016-06-22 36 views
0

我需要與自定義getter和setter創建關係。 這將是很好的關係聲明 此外,我需要改變關係的getter即使沒有數據連接定義的setter /吸氣參數(如換無以更復雜的東西)如何通過自定義setter和/或getter增加sqlalchemy關係

這大致就是我需要:

class Address(Base): 
    #... 

    #hybrid attributes? custom class instrumentation? I need call this function even if no rows are joined to user or company 
    def getter(self): 
     #for each joined row 
     return {'address': "%s %s" % (self.cilty, self.country), 'maximum' : some_data['maximum']} 
     #if no row joined 
     return {'address': None, 'maximum' : some_data['maximum']} 

    def setter(self, user): 
     if some_data['only_country'] != user.country: 
      raise Exception('You can`t live in %s. sorry', (user.country,)) 
     self.country = user.country 

class User(Base): 
    #... 
    addresses = relationship(Address, some_data = {'maximum': 1, only_country: 'UA'}) 

class Company(Base): 
    #... 
    addresses = relationship(Address, some_data = {'maximum': 7, only_country: 'US'}) 

現在我想利用這個關係如下

u = db.query(User).filter_by(id=1).one() 
# I need data from getter here 
print(u.address) 

u = User() 
# I need setter called here with references to user and some_data defined in relationship definition 
u.address = Address() 
+0

它是一個一對一的關係(顯然不是,因爲「對於每個加入行」)?你能否詳細說一下「你的關係上有getter/setter」是什麼意思?你將如何使用這樣的getter/setter? –

+0

1.表地址可以一對一使用,也可以一對多關係(不同型號) 2.我更新了發帖,謝謝 – kakabomba

+0

主要思想是Address對象的行爲依賴於一些數據,我想通過這個數據來自關係申報 – kakabomba

回答

0

最好的解決辦法是使用association_proxy

對於提供例如溶液看起來如下:

class AddressAssociation: 

    some_data = {} 

    def setter(self, AddressObject, value): 
     # change AddressObject here depend on value and self.some_data 

    def getter(self, AddressObject): 
     # return something depend on AddressObject and self.some_data 

    def creator(self, value): 
     # return Address() depend on value and self.some_data 

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

    def get_proxy(self, target_name): 
     return association_proxy(target_name, None, 
      creator=self.creator, 
      getset_factory=lambda *a, **kwa: self.getter, self.setter) 

class User(Base): 
    #... 
    addresses_relationship = relationship(Address) 
    addresses = AddressAssociation({'maximum': 1, 'only_country': 'UA'}).get_proxy('addresses_relationship') 

u = User() # AddressAssociation.creator called 
u.addresses = something # AddressAssociation.creator called 
print(u.addresses) # AddressAssociation.getter called 
u.addresses = something_else # AddressAssociation.setter called 
相關問題