While I understand using `ignore_conflicts` can lead to PostgreSQL not
returning the IDs when a row is ignored (see
[https://stackoverflow.com/questions/34708509/how-to-use-returning-with-
on-conflict-in-postgresql this SO thread]), I don't understand why we
don't return the IDs in the case of `update_conflicts`.
For instance:
{{{
MyModel.objects.bulk_create([MyModel(...)], update_conflicts=True,
update_fields=[...], unique_fields=[...])
}}}
generates a query without a `RETURNING my_model.id` part:
{{{
INSERT INTO "my_model" (...)
VALUES (...)
ON CONFLICT(...) DO UPDATE ...
}}}
If I append the `RETURNING my_model.id` clause, the query is indeed valid
and the ID is returned (checked with PostgreSQL).
I investigated a bit and
[https://github.com/django/django/blob/7414704e88d73dafbcfbb85f9bc54cb6111439d3/django/db/models/query.py#L1840-L1858
this in Django source] is where the `returning_fields` gets removed.
I believe we could discriminate the cases differently so as to keep those
`returning_fields` in the case of `update_conflicts`.
This would be highly helpful when using `bulk_create` as a bulk upsert
feature.
--
Ticket URL: <https://code.djangoproject.com/ticket/34698>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.