Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 自动操作生日=19_Python_Orm_Openerp_Odoo_Openerp 8 - Fatal编程技术网

Python 自动操作生日=19

Python 自动操作生日=19,python,orm,openerp,odoo,openerp-8,Python,Orm,Openerp,Odoo,Openerp 8,我有一个名为students的表,我需要每天检查男性学生的年龄,以确定他们是否超过19岁。我知道我应该每天运行cron函数来检查出生日期,但我需要获取出生日期列中的值,执行一些操作以获取年龄是否超过19岁,将年龄超过19岁的学生添加到另一个表中 以下是我所做的:D请在评论中帮助我:) Python代码 def get_age_comp(self, cr, uid, birth_date,gender , context=None): # birth_date and gender are

我有一个名为students的表,我需要每天检查男性学生的年龄,以确定他们是否超过19岁。我知道我应该每天运行cron函数来检查出生日期,但我需要获取出生日期列中的值,执行一些操作以获取年龄是否超过19岁,将年龄超过19岁的学生添加到另一个表中

以下是我所做的:D请在评论中帮助我:)

Python代码

def get_age_comp(self, cr, uid, birth_date,gender , context=None):


  # birth_date and gender are names of columns in fci.students table like :

  #'birth_date': fields.date(string='Birth Date', required=True)

  #'gender': fields.selection([('m', 'Male'), ('f', 'Female')], string='Gender', required=True)


  student_obj = self.pool.get('fci.student')

  current_date = datetime.now()

  current_year = current_date.year

  birth_dates = parser.parse(birth_date)

  current_age = current_year - birth_dates.year

  gender = student_obj.search(cr, uid, [('gender', '=', True), ('gender', 'like', 'm')])

  if current_age > 19 & gender=='m':


  #i don't know if i do it right and i need to insert these students (name ,age ) to table called 'stat'
XML代码

<record id="ir_cron_actions" model="ir.cron">
  <field name="name">Check age Job</field>
  <field eval="True" name="active"/>
  <field name="user_id" ref="base.user_root"/>
  <field name="interval_number">1</field>
  <field name="interval_type">days</field>
  <field name="numbercall">-1</field>
  <field eval="'fci.student'" name="model"/>
  <field eval="'get_age_comp'" name="function"/>
  <field eval="'()'" name="args"/>
</record>

检查年龄工作
1.
天
-1

这可能不是最聪明的方法,但您应该能够做到以下几点:

def get_age_comp(self, cr, uid, context=None):
    cr.execute('DELETE FROM stat;')
    cr.execute('''INSERT INTO stat(name, age)
                  SELECT name, date_part('years',age(birth_date))
                  FROM fci_student
                  WHERE gender='m'
                  AND date_part('years',age(birth_date)) > 18;''')
如果您不想每次都删除现有的stat行,可以执行类似于about postgresql“insert或update”中的操作

编辑:如果要使用

您可以添加以下导入:

from openerp import api
from datetime import date
from dateutil.relativedelta import relativedelta
然后该方法可以变成:

@api.model
def get_age_comp(self):
    for student in self.search([('gender','=','m'), ('birth_date', '<=', date.today() - relativedelta(years=20))]):
        self.env.cr.execute('INSERT INTO stat VALUES(%s,%s)', (student.name, student.birthdate))
@api.model
def get_age_comp(self):
    to_add = {}
    # getting all male older than 19 years from fci.student
    for student in self.search([('gender','=','m'), ('birth_date', '<=', date.today() - relativedelta(years=20))]):
        to_add[student.name] = student.birth_date
    # ignoring the students already in stat
    for stat in self.env['stat'].search([('name', 'in', to_add.keys())]):
        del to_add[stat.name]
    # adding the new ones
    for name, birth_date in to_add.iteritems():
        stat_model.create({'name': name, 'birth_date': birth_date})
我在这里没有在
stat
中使用年龄,因为这是一种不好的做法(每个人每年至少改变一次),但你可以看到这个问题,并将其混合在代码中

编辑:针对评论中添加的案例

在学生表中创建状态(未成年人getCard gotCard),如果他的 年龄不到20岁,他的身份应该是 未成年,如果他正在获得卡,他的状态应该是getCard,如果他 拿到卡了状态应该是gotCard.我想知道如何 更改代码中的状态:)

如果这是您唯一想做的事情,那么可以通过以下方式完成:

@api.model
def get_age_comp(self):
    self.search([('gender','=','m'), ('status', '=', 'underage'),
                 ('birth_date', '<=', date.today() - relativedelta(years=20))
                ]).write({'status': 'getCard'})

为什么不回答就否决我的问题?!!感谢您的重播,但是使用sql语句非常简单,我需要使用python ORM。在这种情况下,我看不到python ORM的任何优势,特别是如果
stat
不是一个odoo模型,但是我用它编辑了我的答案谢谢您的帮助亲爱的:D我可以问另一个问题吗?如果我需要在学生表中创建雕像(未成年人getCard gotCard)我想知道如果他的年龄超过19岁,他的身份应该是未成年人如果他拿到了卡,他的身份应该是getCard如果他拿到了卡,他的身份应该是getCard.我想知道谁应该在代码中更改身份:)提前谢谢你可以在
搜索()
域列表
('status','=','underage')
,然后在循环中可以添加一行,如
student.status='getCard'
ammm不,如果他超过19岁,我需要更改状态,我的意思是默认为未成年人,但如果他超过19岁,他的状态应该是getCard.)
@api.model
def get_age_comp(self):
    for student in self.search([('gender','=','m'), ('birth_date', '<=', date.today() - relativedelta(years=20)), ('status', '=', 'underage')]):
        student.status = 'getCard'
        # do other things here