﻿id	summary	reporter	owner	description	type	status	component	version	severity	resolution	keywords	cc	stage	has_patch	needs_docs	needs_tests	needs_better_patch	easy	ui_ux
34698	Allow returning IDs in QuerySet.bulk_create() when updating conflicts.	Thomas Chaumeny	Thomas Chaumeny	"Currently, when using `bulk_create` with a conflict handling flag turned on (e.g. `ignore_conflicts` or `update_conflicts`), the primary keys are not set in the returned queryset, as documented in `bulk_create`.

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."	New feature	closed	Database layer (models, ORM)	4.2	Normal	fixed		Chih Sean Hsu	Ready for checkin	1	0	0	0	0	0
