-->

Overide write function

2019-09-19 01:45发布

问题:

He there i tried to override write function to change the student 'standard' in 'fci_student' model and 'fci_standard' model but no luck :( could i have some help ?

and here is my student table model:

from openerp.osv import osv, fields
from datetime import date
from dateutil.relativedelta import relativedelta


class fci_student(osv.osv):
    _name = 'fci.student'
    _columns = {
        'photo': fields.binary(string='Photo'),
        'name': fields.char(size=128, string='First Name', required=True),
        'middle_name': fields.char(size=128, string='Middle Name', required=True),
        'last_name': fields.char(size=128, string='Last Name', required=True),
        'status': fields.selection([('under_Age', 'Under Age'), ('get_card', 'Get Card'), ('got_card', 'Got Card')],
                                   string='Military Status'
                                   , default='under_Age'),
        # basic details
        'user_id': fields.many2one('res.users', 'User'),
        "birth_date": fields.date(string='Birth Date', required=True),
        'gender': fields.selection([('m', 'Male'), ('f', 'Female'), ('o', 'Other')], string='Gender', required=True),
        'title': fields.selection([('mr', 'Mr.'), ('ms', 'Mrs.')], string='Title'),
        'Paid': fields.boolean('Paid Student'),
        'nationality': fields.many2one('res.country', string='Nationality'),
        'id_number': fields.char(size=64, string='ID Card Number', required=True),
        'phone': fields.char(string='Phone Number', size=256, required=True),
        'email_address': fields.char(string='E-mail', size=256, required=True),
        'pay_amount': fields.char(size=64, string='Payment', required=True),
        # Edictional details
        'standard_id': fields.many2one('fci.standard', string='Standard', required=True),
        'group_id': fields.many2one('fci.standard.groups',string='Groups(s)'),

        'terms_id': fields.many2one('fci.terms', string='Term'),
        'sit_number': fields.integer(size=128, string='Sit Number',required=True),
        'subject_id':fields.many2many('fci.subject','student_sub_rel','sub_student_rel','sub_stu_id','Subjects'),
        # Parent details
        'parent_name': fields.char(size=128, string='Parent First Name'),
        'parent_middle_name': fields.char(size=128, string='Parent First Name'),
        'parent_last_name': fields.char(size=128, string='Parent First Name'),
        'parent_phone': fields.integer(size=128, string='Parent Number'),
        'parent_ids': fields.char(size=128, string='Parent E-mail'),
        # Library details
        'library_card_number': fields.char(size=64, string='Library Card Number'),
        'library_card_type': fields.char(size=64, string='Library Card type'),
        'number_of_books_allow': fields.char(size=64, string='Number of books allow'),
        # Address details
        'street_name': fields.char(size=128, string='Street', required=True),
        'city_name': fields.char(size=128, string='City', required=True),
        'state_name': fields.char(size=128, string='State', required=True),
        'Zip': fields.char(size=128, string='Zip Code'),
        'country': fields.char(size=128, string='country', required=True),
        #Exams
        'exam_res': fields.char(size=128, string='Results'),
        'grade': fields.char(size=128, string='Results'),
        'percentage': fields.char(size=128, string='Results'),

    }
#write function to edit student and move him from Standard A to standard B
   def write(self, cr, uid, ids, values, context = None):
       res = super(fci_student, self).write(cr, uid, ids, values, context = context)
       if values.get('standard_id'):
           self.pool.get('fci.standard').write(cr, uid, values['standard_id'], {'student_ids' : [(0, 0, values)]}, context=context)

       return res
#create function to add student to standard model
def create(self, cr, uid, vals, context=None):
        context = context or {}
        created_id = super(fci_student, self).create(cr, uid, vals, context=context)
        if vals.get('standard_id') and vals.get('group_id'):
            self.pool.get('fci.standard').write(cr, uid, vals['standard_id'],
                                                {'student_ids': [(4, created_id)]}, context=context)
            self.pool.get('fci.standard.groups').write(cr, uid, vals['group_id'],
                                                {'student_ids': [(4, created_id)]}, context=context)

and here is my standard table model :

from openerp.osv import osv, fields

class fci_standard(osv.osv):
    _name = 'fci.standard'
    _order = 'sequence'
    _columns = {
        'code': fields.char(size=8, string='Code', required=True),
        'name': fields.char(size=32, string='Name', required=True),
        'sequence': fields.integer('Sequence'),
        'student_ids': fields.many2many('fci.student', 'student_standard_rel', 'fci_student_standard_id', 'standard_id',
                                        string='Student(s)'),
        'groups_ids': fields.many2many('fci.standard.groups', 'standard_group_rel', 'fci_standard_group_id', 'standard_group_id',
                                        string='Groups(s)'),

    }
fci_standard()

it only change the standard in 'fci_student' but it didn't move the student from standard 'A' to standard 'B ' in the standard model!!

回答1:

You have defined wrong relationship between student and standard, in fci.student there is standard_id is many2one then there must be one2many relation in fci.standard for student_ids then and only then you will get auto effect while you changed the standard of any students.

In your case no need to override write method just changed the fields definition like below,

'student_ids': fields.one2many('fci.student', 'standard_id','Student(s)'),

When you changed standard of any students then you will see effect at both side. you need to restart server and update module as well.