Hi Mohit,
The only situations where I have used strings are forward declarations or potential reference loops.
Intuitively I'd say that referencing models by their name adds a slight overhead for class lookup. But since this is supposed to happen only when the model definition is loaded (fields are class level attributes), there are chances that there is no impact on
performances during the application normal operation. The impact should be on the application start phase, but it's probably neglectable compared to the overall start time.
Since I've never done any real timing about this point, nor studied Django source code to identify the real mechanism, I'm strongly interested in other opinions... especially if my analysis is wrong 😉
Best
Eric