On 12/16/2015 05:40 AM, Jitesh Nair wrote: > I am trying to convert my association table to a class view and using > associationproxy to link them. When i try to append them, it fails. > *My code:* > | > > classHospitalList(db.Model): > id=db.Column(db.Integer,primary_key=True) > doctor_id=db.Column(db.Integer,db.ForeignKey('doctor_profile.id')) > hospital_id=db.Column(db.Integer,db.ForeignKey('hospital_profile.id')) > from_time=db.Column(db.Time) > limits=db.Column(db.Integer) > > doctor=db.relationship('DoctorProfile',backref='hospitallist') > hospital=db.relationship('HospitalProfile',backref='hospitallist')
the error is because of this duplicate use of the same "backref" target. A bi-directional relationship may only involve two relationships. This one involves three: "doctor", "hospital", and "hospitallist". You'd need to change that. > > classHospitalProfile(db.Model): > id=db.Column(db.Integer,primary_key=True) > hospital_group_id=db.Column(db.Integer,db.ForeignKey( > HospitalGroupProfile.id)) > hospital_name=db.Column(db.String(100)) > doctor=association_proxy('hospitallist','doctor') > admins=db.relationship( > 'BasicProfile',secondary=ADMINSH, > backref='hprofile_of_basic_profile') > hospital=db.relationship( > 'Hospital',backref=db.backref('hprofile_of_hospital',uselist=False), > uselist=False,cascade='all, delete-orphan') > > def__repr__(self): > return'%s'%self.hospital_name > > > classDoctorProfile(db.Model): > id=db.Column(db.Integer,primary_key=True) > basic_profile_id=db.Column(db.Integer,db.ForeignKey(BasicProfile.id)) > user=db.relationship( > 'BasicProfile',backref=db.backref( > 'dprofile_of_basic_profile',cascade='all, > delete-orphan'),uselist=False) > hospital=association_proxy( > > 'hospitallist','hospital',creator=lambdainstance:HospitalList(hospital=instance)) > qualification=db.Column(db.String(100)) > > facilities=db.relationship('Facilities',backref='doctor_of_facilities',lazy='dynamic') > address=db.relationship( > 'Address',backref='dprofile_of_address',cascade='all, > delete-orphan') > reg_number=db.Column(db.String(100)) > contact=db.relationship('Contact',backref=db.backref( > 'doctor_of_contact',uselist=False),uselist=False,cascade='all, > delete-orphan') > testimonial=db.relationship( > 'Testimonial',backref='dprofile_of_testimonial',lazy='dynamic') > department=db.relationship( > 'Department',secondary=DDEPARTMENTS, > backref='doctor_of_department') > category=db.relationship( > 'Category',secondary=DCATEGORIES, > backref='doctor_of_category') > > def__repr__(self): > return'%s'%self.id > > | > > *My Traceback:* > | > > In[7]:d.hospital.append(d) > --------------------------------------------------------------------------- > ValueError Traceback(most recent call last) > <ipython-input-7-a4a45538eb38>in<module>() > ---->1d.hospital.append(d) > > /home/projects/getmydoctor_virtual/local/lib/python2.7/site-packages/sqlalchemy/ext/associationproxy.pyc > inappend(self,value) > 600 > 601 defappend(self,value): > -->602 item =self._create(value) > 603 self.col.append(item) > 604 > > /home/projects/getmydoctor_virtual/local/lib/python2.7/site-packages/sqlalchemy/ext/associationproxy.pyc > in_create(self,value) > 523 > 524 def_create(self,value): > -->525 returnself.creator(value) > 526 > 527 def_get(self,object): > > /home/projects/getmydoctor_virtual/mydoc/getmydoctor/models.pyc > in<lambda>(instance) > 223 'dprofile_of_basic_profile',cascade='all, > delete-orphan'),uselist=False) > 224 hospital =association_proxy( > -->225 > 'hospitallist','hospital',creator=lambdainstance:HospitalList(hospital=instance)) > 226 qualification =db.Column(db.String(100)) > 227 facilities > =db.relationship('Facilities',backref='doctor_of_facilities',lazy='dynamic') > > <string>in__init__(self,**kwargs) > > /home/projects/getmydoctor_virtual/local/lib/python2.7/site-packages/sqlalchemy/orm/state.pyc > in_initialize_instance(*mixed,**kwargs) > 304 except: > 305 withutil.safe_reraise(): > -->306 manager.dispatch.init_failure(self,args,kwargs) > 307 > 308 defget_history(self,key,passive): > > /home/projects/getmydoctor_virtual/local/lib/python2.7/site-packages/sqlalchemy/util/langhelpers.pyc > in__exit__(self,type_,value,traceback) > 58 exc_type,exc_value,exc_tb =self._exc_info > 59 self._exc_info =None # remove potential circular > references > --->60 compat.reraise(exc_type,exc_value,exc_tb) > 61 else: > 62 self._exc_info =None # remove potential circular > references > > /home/projects/getmydoctor_virtual/local/lib/python2.7/site-packages/sqlalchemy/orm/state.pyc > in_initialize_instance(*mixed,**kwargs) > 301 > 302 try: > -->303 returnmanager.original_init(*mixed[1:],**kwargs) > 304 except: > 305 withutil.safe_reraise(): > > /home/projects/getmydoctor_virtual/local/lib/python2.7/site-packages/sqlalchemy/ext/declarative/base.pyc > in_declarative_constructor(self,**kwargs) > 647 "%r is an invalid keyword argument for %s"% > 648 (k,cls_.__name__)) > -->649 setattr(self,k,kwargs[k]) > 650_declarative_constructor.__name__ ='__init__' > 651 > > /home/projects/getmydoctor_virtual/local/lib/python2.7/site-packages/sqlalchemy/orm/attributes.pyc > in__set__(self,instance,value) > 222 def__set__(self,instance,value): > 223 self.impl.set(instance_state(instance), > -->224 instance_dict(instance),value,None) > 225 > 226 def__delete__(self,instance): > > /home/projects/getmydoctor_virtual/local/lib/python2.7/site-packages/sqlalchemy/orm/attributes.pyc > inset(self,state,dict_,value,initiator,passive,check_old,pop) > 800 )) > 801 > -->802 value > =self.fire_replace_event(state,dict_,value,old,initiator) > 803 dict_[self.key]=value > 804 > > /home/projects/getmydoctor_virtual/local/lib/python2.7/site-packages/sqlalchemy/orm/attributes.pyc > infire_replace_event(self,state,dict_,value,previous,initiator) > 822 value =fn( > 823 state,value,previous,initiator or > -->824 self._replace_token > orself._init_append_or_replace_token()) > 825 > 826 state._modified_event(dict_,self,previous) > > /home/projects/getmydoctor_virtual/local/lib/python2.7/site-packages/sqlalchemy/orm/attributes.pyc > inemit_backref_from_scalar_set_event(state,child,oldchild,initiator) > 1162 state.obj(), > 1163 initiator, > ->1164 passive=PASSIVE_NO_FETCH) > 1165 returnchild > 1166 > > /home/projects/getmydoctor_virtual/local/lib/python2.7/site-packages/sqlalchemy/orm/attributes.pyc > inappend(self,state,dict_,value,initiator,passive) > 991 state._get_pending_mutation(self.key).append(value) > 992 else: > -->993 collection.append_with_event(value,initiator) > 994 > 995 defremove(self,state,dict_,value,initiator,passive=PASSIVE_OFF): > > /home/projects/getmydoctor_virtual/local/lib/python2.7/site-packages/sqlalchemy/orm/collections.pyc > inappend_with_event(self,item,initiator) > 651 """Add an entity to the collection, firing mutation > events.""" > 652 > -->653 self._data()._sa_appender(item,_sa_initiator=initiator) > 654 > 655 defappend_without_event(self,item): > > /home/projects/getmydoctor_virtual/local/lib/python2.7/site-packages/sqlalchemy/orm/collections.pyc > inappend(self,item,_sa_initiator) > 1070 defappend(fn): > 1071 defappend(self,item,_sa_initiator=None): > ->1072 item =__set(self,item,_sa_initiator) > 1073 fn(self,item) > 1074 _tidy(append) > > /home/projects/getmydoctor_virtual/local/lib/python2.7/site-packages/sqlalchemy/orm/collections.pyc > in__set(collection,item,_sa_initiator) > 1042 executor =collection._sa_adapter > 1043 ifexecutor: > ->1044 item =executor.fire_append_event(item,_sa_initiator) > 1045 returnitem > 1046 > > /home/projects/getmydoctor_virtual/local/lib/python2.7/site-packages/sqlalchemy/orm/collections.pyc > infire_append_event(self,item,initiator) > 714 self.owner_state, > 715 self.owner_state.dict, > -->716 item,initiator) > 717 else: > 718 returnitem > > /home/projects/getmydoctor_virtual/local/lib/python2.7/site-packages/sqlalchemy/orm/attributes.pyc > infire_append_event(self,state,dict_,value,initiator) > 934 value =fn( > 935 state,value, > -->936 initiator orself._append_token > orself._init_append_token()) > 937 > 938 state._modified_event(dict_,self,NEVER_SET,True) > > /home/projects/getmydoctor_virtual/local/lib/python2.7/site-packages/sqlalchemy/orm/attributes.pyc > inemit_backref_from_collection_append_event(state,child,initiator) > 1175 ifinitiator.parent_token isnotparent_token and\ > 1176 initiator.parent_token isnotchild_impl.parent_token: > ->1177 _acceptable_key_err(state,initiator,child_impl) > 1178 elifinitiator.impl isnotchild_impl or\ > 1179 initiator.op notin(OP_APPEND,OP_REPLACE): > > /home/projects/getmydoctor_virtual/local/lib/python2.7/site-packages/sqlalchemy/orm/attributes.pyc > in_acceptable_key_err(child_state,initiator,child_impl) > 1123 initiator.parent_token, > 1124 child_impl.parent_token, > ->1125 attribute.impl.parent_token > 1126 ) > 1127 ) > > ValueError:Bidirectionalattribute conflict > detected:Passingobject<DoctorProfileat 0xab8a26c>to attribute > "HospitalList.hospital"triggers a modify eventon attribute > "HospitalList.doctor"via the backref "DoctorProfile.hospitallist". > > | > > Regards, > JItesh Nair > > -- > You received this message because you are subscribed to the Google > Groups "sqlalchemy" group. > To unsubscribe from this group and stop receiving emails from it, send > an email to sqlalchemy+unsubscr...@googlegroups.com > <mailto:sqlalchemy+unsubscr...@googlegroups.com>. > To post to this group, send email to sqlalchemy@googlegroups.com > <mailto:sqlalchemy@googlegroups.com>. > Visit this group at https://groups.google.com/group/sqlalchemy. > For more options, visit https://groups.google.com/d/optout. -- You received this message because you are subscribed to the Google Groups "sqlalchemy" group. To unsubscribe from this group and stop receiving emails from it, send an email to sqlalchemy+unsubscr...@googlegroups.com. To post to this group, send email to sqlalchemy@googlegroups.com. Visit this group at https://groups.google.com/group/sqlalchemy. For more options, visit https://groups.google.com/d/optout.