Если User связан с Company по форейн кею, то если Company не существует, то и юзера нет, значит когда мы шлем post на .../api/companies/ нам необходимо создать юзера, а значит первый вариант неплох. Правда это все разумно только, если у user'а нет возможности сменить компанию
Атрибутами являются все свойства объекта, по сути - все переменные, определенные внутри объекта и его родителей. Все они заносятся в словарь объекта и возвращаются диром.
Хотите без методов -
list(filter(lambda attr: not callable(getattr(obj, attr)), dir(obj)))
Смотрел видео с конференции по Python. В общем: GIL действует только на питоновский код, т.е. если Python выступает лишь оберткой, а ресурсоемкие операции делаются C, то сишный код будет распределен операционной системой на разные процессоры и в итоге получается прирост производительности.
Функция walk из модуля os рекурсивно обходит необходимую директорию. А дальше просто открываете файл в режиме записи или дополнения и записываете, что нужно (ну и закрываете, конечно)