I keep away from tossing ORM objects around the system. GETS are pretty cheap.
my task arguments are generally:
int = primary key of ORM object
dict = "instructions" payload of what to do
for image processing, it's generally
optimize_images( orm_id , { file_b64=BLOB , selected_resizes=[], } )
celery grabs and uses it's own session, pulling data off the database. it optimizes the image, archives it to S3 and does the same for the resizes. then updates the database to reflect all the filesizes and locations.