From 531c96de34d746a58b9b7320378296730312c016 Mon Sep 17 00:00:00 2001
From: DhruvaPatil98 <dhruvapatil98@gmail.com>
Date: Thu, 23 Jun 2022 12:32:41 +0530
Subject: [PATCH] [4.1.x] Fixed #33799, Refs #31685 -- Added parameters for
 updating conflicts to QuerySeta.abulk_create().

Backport of c627226d05dd52aef59447dcfb29cec2c2b11b8a from main
---
 django/db/models/query.py     | 13 ++++++++++++-
 tests/async_queryset/tests.py | 18 +++++++++++++++++-
 2 files changed, 29 insertions(+), 2 deletions(-)

diff --git a/django/db/models/query.py b/django/db/models/query.py
index 4e2882e062..b00a7f3325 100644
--- a/django/db/models/query.py
+++ b/django/db/models/query.py
@@ -834,11 +834,22 @@ class QuerySet:
 
         return objs
 
-    async def abulk_create(self, objs, batch_size=None, ignore_conflicts=False):
+    async def abulk_create(
+        self,
+        objs,
+        batch_size=None,
+        ignore_conflicts=False,
+        update_conflicts=False,
+        update_fields=None,
+        unique_fields=None,
+    ):
         return await sync_to_async(self.bulk_create)(
             objs=objs,
             batch_size=batch_size,
             ignore_conflicts=ignore_conflicts,
+            update_conflicts=update_conflicts,
+            update_fields=update_fields,
+            unique_fields=unique_fields,
         )
 
     def bulk_update(self, objs, fields, batch_size=None):
diff --git a/tests/async_queryset/tests.py b/tests/async_queryset/tests.py
index 792797fb9d..1b6dddce1f 100644
--- a/tests/async_queryset/tests.py
+++ b/tests/async_queryset/tests.py
@@ -6,7 +6,7 @@ from asgiref.sync import async_to_sync, sync_to_async
 
 from django.db import NotSupportedError, connection
 from django.db.models import Sum
-from django.test import TestCase, skipUnlessDBFeature
+from django.test import TestCase, skipIfDBFeature, skipUnlessDBFeature
 
 from .models import SimpleModel
 
@@ -111,6 +111,22 @@ class AsyncQuerySetTest(TestCase):
         qs = await SimpleModel.objects.abulk_create(instances)
         self.assertEqual(len(qs), 10)
 
+    @skipUnlessDBFeature("has_bulk_insert", "supports_update_conflicts")
+    @skipIfDBFeature("supports_update_conflicts_with_target")
+    @async_to_sync
+    async def test_update_conflicts_unique_field_unsupported(self):
+        msg = (
+            "This database backend does not support updating conflicts with specifying "
+            "unique fields that can trigger the upsert."
+        )
+        with self.assertRaisesMessage(NotSupportedError, msg):
+            await SimpleModel.objects.abulk_create(
+                [SimpleModel(field=1), SimpleModel(field=2)],
+                update_conflicts=True,
+                update_fields=["field"],
+                unique_fields=["created"],
+            )
+
     async def test_abulk_update(self):
         instances = SimpleModel.objects.all()
         async for instance in instances: