Problems using one2many and many2many fields

111 views
Skip to first unread message

Carlos Ibrahim Arias

unread,
May 3, 2017, 3:15:08 AM5/3/17
to tryton-dev
Hi! I'm having problems using a one2many field on another model different from the class it was created on. I tried to use a many2many field so that I can view the related fields but cant make it work

This is the first class... 

class Z_MedicalHistory(ModelSQL, ModelView):

   
'Patient Medical History'
    __name__
= 'gnuhealth.z_medical_history'

    medical_history_date
= fields.DateTime('Date and Time', required=True)

    healthprof
= fields.Many2One(
       
'gnuhealth.healthprofessional', 'Health Prof',
       
select=True, required=True, help='Health Professional')

    patient
= fields.Many2One(
       
'gnuhealth.patient', 'Patient',
       
select=True, required=True, help='Patient Name')

    comments
= fields.Text('Comments', required=True)

   
@staticmethod
   
def default_medical_history_date():
       
return datetime.now()

   
@staticmethod
   
def default_healthprof():
        pool
= Pool()
       
HealthProfessional = pool.get('gnuhealth.healthprofessional')
       
return HealthProfessional.get_health_professional()


   
@staticmethod
   
def default_patient():
        pool
= Pool()
       
Patient = pool.get('gnuhealth.patient')
       
return Patient.name


I added the following lines to the class PatientData (gnuhealth.patient) so that they are related

    z_medical_history = fields.One2Many(
       
'gnuhealth.z_medical_history',
       
'Z_MedicalHistory', 'Patient Medical History', help='Enter the Patient Medical History'
       
' for the patient.')



The problem is that there is another class call PatientEvaluation where I need to hace access and view Z_MedicalHistory using the patient field of PatientEvaluation. Tried the following but it's not working:

    z_medical_history = fields.Many2Many('gnuhealth.z_medical_history',
       
'patient', None, 'Historial Medico del Paciente',
        domain
=[('patient', '=', Eval('patient'))],
        depends
=['patient'])

I guess I'm not doing it right. :(

Thanks it advanced!


Sergi Almacellas Abellana

unread,
May 3, 2017, 3:46:08 AM5/3/17
to tryto...@googlegroups.com
El 03/05/17 a les 04:23, Carlos Ibrahim Arias ha escrit:
> Hi! I'm having problems using a one2many field on another model
> different from the class it was created on. I tried to use a many2many
> field so that I can view the related fields but cant make it work

I'm not sure to understand what are you trying to achieve. Can you
elaborate?
> 'Z_MedicalHistory','Patient Medical History',help='Enter the
> Patient Medical History'
> ' for the patient.')
>

The second argument of the One2Many field is the target field. This
means the name of the field which has the reverse Many2One relation in
the target model. So in your case you have yo change 'Z_MedicalHistory'
for 'patient'.
> |
>
>
> The problem is that there is another class call PatientEvaluation where
> I need to hace access and view Z_MedicalHistory using the patient field
> of PatientEvaluation.

With this description, I imagine you want a function field that returns
all the MedialHistory entries for this patient, not a Many2Many.

Tried the following but it's not working:
>
> |
> z_medical_history =fields.Many2Many('gnuhealth.z_medical_history',
> 'patient',None,'Historial Medico del Paciente',
> domain=[('patient','=',Eval('patient'))],
> depends=['patient'])
> |

Many2Many fields require an intermediary table to store the relation
between both records.
>
> I guess I'm not doing it right. :(
>
> Thanks it advanced!
>
Hope it helps.


--
Sergi Almacellas Abellana
www.koolpi.com
Twitter: @pokoli_srk

Albert Cervera i Areny

unread,
May 3, 2017, 3:46:36 AM5/3/17
to tryto...@googlegroups.com
AFAIS the One2Many definition should be:

z_medical_history = fields.One2Many(
'gnuhealth.z_medical_history',
'patient', 'Patient Medical History', help='Enter the Patient
Medical History'
' for the patient.')

Note the second parameter must be the name of the Many2One field of
the related model.

>
>
>
> The problem is that there is another class call PatientEvaluation where I
> need to hace access and view Z_MedicalHistory using the patient field of
> PatientEvaluation. Tried the following but it's not working:
>
> z_medical_history = fields.Many2Many('gnuhealth.z_medical_history',
> 'patient', None, 'Historial Medico del Paciente',
> domain=[('patient', '=', Eval('patient'))],
> depends=['patient'])

If you need to access the information of z_medial_history from another
model either you link it directly or you create a Function field. I
guess the latter is what you're looking for. So you need something
like this:

z_medical_history =
fields.Function(fields.Many2Many('gnuhealth.z_medical_history',
None, None, 'Historial Medico del Paciente'), 'get_z_medial_history')


>
> I guess I'm not doing it right. :(
>
> Thanks it advanced!
>
>
> --
> You received this message because you are subscribed to the Google Groups
> "tryton-dev" group.
> To view this discussion on the web visit
> https://groups.google.com/d/msgid/tryton-dev/5e9dceb7-28d3-4dc1-be43-61b5834cf895%40googlegroups.com.



--
Albert Cervera i Areny
http://www.NaN-tic.com
Tel. 93 553 18 03

Carlos Ibrahim Arias

unread,
May 3, 2017, 11:10:06 AM5/3/17
to tryton-dev
I created the model Z_MecialHistory to store information of the patient (date, patient and healthprofessional) and it is related to the model PatientData. The point is that, as Albert said, I need to access to the information in the model PatientEvaluation.

After adding the function field Albert recommended to the model PatientEvaluation
....

    z_medical_history = fields.Function(fields.Many2Many('gnuhealth.z_medical_history',

         
None, None, 'Historial Medico del Paciente'), 'get_z_medical_history')


... I added the following function to PatientEvaluation model guessing that I had to use the current patient ....

    def get_z_medical_history(self, name):

        pool
= Pool()
       
Patient = pool.get('gnuhealth.patient')

       
return Patient.z_medical_history

But it doesnt work... I dont really understant how to the get function should be coded to worrk...






And got the following error...

Sergi Almacellas Abellana

unread,
May 3, 2017, 11:46:18 AM5/3/17
to tryto...@googlegroups.com
El 03/05/17 a les 16:55, Carlos Ibrahim Arias ha escrit:
> I created the model Z_MecialHistory to store information of the patient
> (/date, patient and healthprofessional/) and it is related to the model
> PatientData. The point is that, as Albert said, I need to access to the
> information in the model PatientEvaluation.
>
> After adding the function field Albert recommended to the model
> PatientEvaluation
> ....
>
> |
> z_medical_history
> =fields.Function(fields.Many2Many('gnuhealth.z_medical_history',
> None,None,'Historial Medico del Paciente'),'get_z_medical_history')
>
> |
>
> ... I added the following function to PatientEvaluation model guessing
> that I had to use the current patient ....
>
> |
> defget_z_medical_history(self,name):
> pool =Pool()
> Patient=pool.get('gnuhealth.patient')
> returnPatient.z_medical_history
> |
>
> But it doesnt work... I dont really understant how to the get function
> should be coded to worrk...
You should return the list of ids of the related record. So it will be
something like:

def get_z_medical_history(self, name):
pool = Pool()
History = pool.get('...')
return [x.id for x in History.search([('patient', '=', self.id)])
Reply all
Reply to author
Forward
0 new messages