Correct. For OTAA, the DevAddr changes with each Join Accept. The Join Request has no notion of a DevAddr.
As for decoding: if they’re very different I would indeed create multiple applications. If they’re almost the same, maybe you can determine the device type by payload length or port number. See How to best write an application that contains many nodes with different measure data types.