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.

Reply via email to