Python 自动操作生日=19
我有一个名为students的表,我需要每天检查男性学生的年龄,以确定他们是否超过19岁。我知道我应该每天运行cron函数来检查出生日期,但我需要获取出生日期列中的值,执行一些操作以获取年龄是否超过19岁,将年龄超过19岁的学生添加到另一个表中 以下是我所做的:D请在评论中帮助我:) Python代码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
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