first, i think that yur definition of a m2o field should be dot notated , not underscore... like:
'project_service': fields.many2one('project.service', string='service')
second... if that fields has no value (or it has Null value) it is interpreted as False. so in your report parser, you should check if the field value exists, and suggest some value for cases where it does not exist...
as noted in Tom's answer... in your report (rml or qweb) in part where you call a m2o field value
(let's say it is o.project_service ) you should do something like:
if o.project_service != Null or o.project_service Is Not False:
print o.project_service
else:
print ''
to put it in short (pythonic form) jou can just write:
o.project_service and o.project_service or ''
(in human readable format it would read like: if there is a o.project_service value, write thta value othervise write '' or any other desired value/blank string...)
hope this will explain why and what you need to do in report:)
For a many2one field, if no value is selected, it will return False. If there is any value for it, it displays the id of the selected record at the print statement.
I think syntax like 'project_service' : fields.many2one('project.service', string= 'service'), Try this one.