The other two tables, item and model, are temporary tables created during this particular process. Unfortunately, I don't have those table sizes.
Those temporary tables aren't providing any output to the query, so their only role must be to restrict the rows returned by the permanent tables. If they restrict that by a lot, then it could do a nested loop over the temp tables, doing indexed queries against the permanent tables assuming you have the right indexes.
Temporary tables do not get analyzed automatically, so you should probably run ANALYZE on them explicitly before this big query.
What additional information can I gather in order have a better understanding of how to improve this query?
What indexes do the tables have? What is the output of EXPLAIN, or better yet EXPLAIN (ANALYZE,BUFFERS), for the query?