There are two main reasons for clone() :
This allows the chain. When you chain ask each other (for example, several filter() calls), you need a new copy of the query set every time you can change.
This avoids stale cache results. Since querysets cache their results when evaluating them, if you want you to get into the database again, you need to clone the request.
If you know what you are doing, you can use it, but note that this is not a public API. In this interesting Django thread developer, the developers talk about whether clone() should be open. They solve this, in part because:
The biggest problem with the public .clone() method is that private ._clone() doesn't just clone. In some cases, cloning also changes the behavior of the QuerySet.
source share