I'm pretty new to Postgres and very new to SQLAlchemy, so I apologise if this is a silly question.
I've spent sometime googling this and reading the documentation on SQLAlchemy but I cant seem to find a straight answer.
So, my question is this..
As relationships are defined in code when using ORM, providing the database table structures define the necessary column fields, do you actually need to define ForeignKey constraints in the database itself as well?
I know that the constraints can help with enforcing integrity but do they need to be there for a successful ORM implementation?
Foreign key constraints don't need to be there in order to have a successful ORM implementation. I think it's probably most common for the ORM to try to manage that kind of thing itself rather than follow database best practices. 
Personally, I have a problem with that approach. I usually deal with enterprise databases that have many programs written in many different languages accessing the database. The other programs are simply not going to delete rows and cascade the deletes by calling the ORM, even if that's possible. 
Some ORMs support "legacy" databases, meaning the ORM can be configured to deal with databases that already implemented arbitrary constraints, primary keys that have multiple columns rather than an ID number per table, cascading updates and deletes, and so on.
In any case, the database belongs to the business, not to the ORM. Support for that idea varies, too.
Do you need to define relationship in the DB if you use ORM?