I got reasons to pass only GUID. Passing SQLALchemy table class instance around is error-prone in certain situations. For example, when you are dealing with multi-threading, passing object instance around causes problem. 

```python
def process(records):
    for record in records:
        with transaction.manager:
            record.num += 1
            session.add(record)
    
pool = threading_pool()
for thread in pool:
    records = get_records(100)
    thread.run(process, records)
```

Let's say, we are processing transactions and we like to speed it up by using multi-threading or multi-processor. The code we wrote above looks fine, but it is not. You cannot create SQLALchemy object in one thread and pass it to another (exception will be raised). There is some thread-local stuff Session object is dealing with (sessions are bound to local threads). So, in this case, I prefer to make model only accept GUID argument rather than object. 

There are some other reasons, but I cannot recall (like dealing with database transaction or what).