I left some notes on the PR but I think the crux of the issue here is that you are trying to change the meaning of Model.save(force_insert=True) from force the insert of the current model to force the insert of the model and all its bases.
This is a problem not only for QuerySet.create but likely for a many other use cases in the wild that need a way to only force the creation of the leaf table but not others. In other words, the change you are proposing take one feature way (only insert leaf model) to introduce a new one (insert all bases) and thus is fundamentally backward incompatible.
To me the only way forward here is to introduce a new feature but as you've mentioned changing the signature of Model.save() is comple.
The only viable option I can think of is to change the accepted type for force_insert from bool to Type[Model] | Tuple[Type[Model]] to allow save_parent to determine which one should be forced inserted and which shouldn't.
In the case of the reported usage case
```
class ParentModel(models.Model):
id = models.BigIntegerField(primary_key=True)
class ChildModel(ParentModel):
pass
```
That would mean that force_insert=ParentModel must be passed to opt-in into the full insertion mode (both issubclass(ChildModel, ParentModel) and issubclass(ParentModel, ParentModel))
```
ChildModel(id=1).save(force_insert=ParentModel)
```
That seems like a viable option to me because
- An empty tuple is falsy which is coherent with force_insert=False
- A non-empty tuple is truthy and which is coherent with the fact the current leaf model must be inserted (current behavior)
- Complex MTI scenario forced insertion needs can be targeted with specially crafted base tuples (think of diamond inheritance)
- If a deep ancestor must be inserted then it means that all its children must also be inserted (makes sense due to how children must reference to parent)
- force_insert=models.Model can be used as a generic way to specify that all bases must be inserted independently of the chain of models involved
Hope that makes sense!
Cheers,
Simon