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 [email protected]
> <mailto:[email protected]>.
> To post to this group, send email to [email protected]
> <mailto:[email protected]>.
> 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 [email protected].
To post to this group, send email to [email protected].
Visit this group at https://groups.google.com/group/sqlalchemy.
For more options, visit https://groups.google.com/d/optout.