рассчитать возраст в openerp

Я хочу, чтобы код мог вычислять возраст

def _compute_age(self, cr, uid, ids, field_name, field_value, context=None):
    records = self.browse(cr, uid, ids, context=context)
    result={}
    for r in records:
        age=0
        if r.date_birth:
            d = strptime(r.date_birth,"%Y-%m-%d")
            count = date(d[0],d[1],d[2])-date.today()
            age = count.days/365 
        result[r.id] = age
    return result

но неправильный объект cursor не имеет атрибута 'browse', в чем проблема?

P.S: это мой новый код

def _compute_age(self, cr, uid, ids,field_name,field_value,arg, context=None):
    records = self.browse(cr, uid, ids, context=context)
    result = {}
    for r in self.browse(cr, uid, ids, context=context):
        age=0
        if r.date_birth:
            print date_birth
            age = (datetime.now()-datetime.strptime(r.date_birth,"%Y-%m-%d")).days/365.25
        result[r.id] = age 

    return result
_columns = {
    'date_birth': fields.date('Date of Birth'),
    'age' : fields.function(_compute_age, type='char', method=True, string='Age'),

person J.C    schedule 23.07.2012    source источник
comment
Проблема скорее всего в вызове метода. Можете ли вы опубликовать этот код?   -  person Daniel Reis    schedule 23.07.2012
comment
можете ли вы вставить свое функциональное поле   -  person OmaL    schedule 24.07.2012
comment
если type='char', то также укажите размер. например размер=64   -  person OmaL    schedule 24.07.2012


Ответы (3)


Сообщение об ошибке не связано с расчетом даты. Возможно, вы используете модуль, несовместимый с используемой вами версией OpenERP.

Вам необходимо предоставить более подробную информацию о вашем модуле, версии OpenERP и надстроек, а также полную трассировку.

Хотя это и не имеет отношения к ошибке, ваш расчет возраста даст отрицательное значение.

Более простой код будет:

from datetime import datetime
...
    if r.date_birth:
        age = (datetime.now()-datetime.strptime(r.date_birth,"%Y-%m-%d")).days/356

Что касается нового кода и сообщения об ошибке ниже, вы не можете добавить в список, назначив новый индекс, вместо этого измените result на словарь; Изменить result = [] на result = {}

person Mohammad Alhashash    schedule 23.07.2012
comment
Вы наверняка упомянули /365 вместо /356. Я не поклонник этого подхода деления по дням, но если вы используете его, то более точно разделить /365.25. Но ИМХО лучше всего считать месяцы и делить на 12. Я разместил функцию для этого здесь. - person Daniel Reis; 23.07.2012
comment
Вторая версия имеет неверный вызов для просмотра(). Вы должны вызвать self.browse(), так как вызовbrowse() должен быть неопределенным в контексте функции. - person Mohammad Alhashash; 24.07.2012
comment
уже пробовал. но такая же ошибка. вот так правильно records = self.browse(cr, uid, ids, context=context) - person J.C; 24.07.2012
comment
@MohammadAli Я хочу сделать, плавать ..., так что если мы выберем 27 марта 1989 года. в полях возраст результат 23 - person J.C; 24.07.2012
comment
пожалуйста, помогите мне... это очень срочно2 - person J.C; 24.07.2012

Ниже приведен мой код. он возвращает строку.

from dateutil.relativedelta import relativedelta
from datetime import datetime
def _compute_age(self, cr, uid, ids, field_name, arg, context={}):
    result = {}
    now = datetime.now()
    for r in self.browse(cr, uid, ids, context=context):
      if r.date_birth:
        dob = datetime.strptime(r.date_birth,'%Y-%m-%d')
        delta=relativedelta (now, dob)
        result[r.id] = str(delta.years) +"y "+ str(delta.months) +"m "+ str(delta.days)+"d" #if you only want date just give delta.years
      else:
        result[r.id] = "No DoB !"
    return result


_columns = {
    'age' : fields.function(_compute_age, method=True, type='char', size=32, string='Age',),
}
person OmaL    schedule 24.07.2012
comment
извините... это ошибка result[r.id] = No DoB ! IndexError: индекс назначения списка вне допустимого диапазона - person J.C; 24.07.2012
comment
Извините моя ошибка. пожалуйста, измените результат=[] на результат={} - person OmaL; 24.07.2012

Я создал студенческий модуль и получил поле возраста из поля даты рождения, используя поле вычислений.

модели.py

from openerp import models, fields, api
from dateutil.relativedelta import relativedelta
from datetime import date

class studentimg(models.Model):

     _name = 'studentimg.studentimg'
     name=fields.Char('Student')
     email = fields.Char('Email')
     phone = fields.Char('Phone')
     gender = fields.Selection([('m','Male'),('f','Female')],'Gender')
     is_active =fields.Boolean('Active')
     birth_date=fields.Date('Birth Date')
     age=fields.Char('Age',compute='calculate_age')
     image=fields.Binary()
     mat=fields.Integer('Maths')
     phy=fields.Integer('Physics')
     tot=fields.Integer('Total',compute='_computediff')

     @api.onchange('phy')
     def _computediff(self):
          self.tot = self.mat + self.phy

     def calculate_age(self):
         today = date.today()
         #self.age= today.year -  self.birth_date.year - ((today.month, today.day) < (self.birth_date.month, self.birth_date.day))
         yr=int(self.birth_date[0:4])
         mt=int(self.birth_date[5:7])
         dt=int( self.birth_date[8:10])
         self.age = today.year - yr - ((today.month, today.day) < (mt, dt))

шаблоны.xml

<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data>
<record id='student_form_view' model="ir.ui.view">
    <field name="name">Student Form View</field>
        <field name="model">studentimg.studentimg</field>
        <field name="arch" type="xml">
            <form string="Student Information">
                <sheet>
                        <field name="image" widget="image" class="oe_left oe_avatar"/>
                    <h2>
                        <field name="name"/>
                    </h2>
                           <notebook>
                             <page string="Public Information">
                                 <group>
                                          <group string="Contact Information" class="oe_left oe_avatar">
                                           <field name="email"/>
                                           <field name="phone"/>
                                          </group>



                                          <group string="Student Details">
                                             <field name="gender"/>
                                             <field name="is_active"/>
                                          </group>
                                          <group string="DOB">
                                              <field name="birth_date"/>
                                              <field name="age"/>
                                          </group>
                                          <group string="Total Marks">
                                              <field name="mat"/>
                                              <field name="phy"/>
                                              <field name="tot"/>
                                          </group>
                                 </group>
                             </page>
                           </notebook>
                </sheet>
            </form>
        </field>
</record>

<record id='student_tree_view' model="ir.ui.view">
    <field name="name">Student Tree View</field>
        <field name="model">studentimg.studentimg</field>
        <field name="arch" type="xml">
            <tree string="Student Details">
                <field name="image"/>
                <field name="name"/>
                <field name="email"/>
                <field name="phone"/>
                <field name="gender"/>
                <field name="is_active"/>
                <field name="birth_date"/>
            </tree>
        </field>
</record>
<record id="students_students_action" model="ir.actions.act_window">
       <field name="name">Students</field>
       <field name="res_model">studentimg.studentimg</field>
       <field name="view_mode">tree,form</field>
</record>
person Vinoth J S    schedule 15.09.2017