1
0
mirror of https://github.com/django/django.git synced 2025-07-13 14:19:21 +00:00

[5.2.x] Fixed #36502 -- Restored UNNEST strategy for foreign key bulk inserts on PostgreSQL.

Regression in 764af7a3d6c0b543dcf659a2c327f214da768fe4.

Backport of 0fe218842e0e396e3ab3982bd21227968a9e7fd8 from main.
This commit is contained in:
Simon Charette 2025-07-10 12:33:00 -04:00 committed by Mariusz Felisiak
parent abc10ab7f9
commit 3df1ad57bf
3 changed files with 21 additions and 3 deletions

View File

@ -40,7 +40,8 @@ class SQLInsertCompiler(BaseSQLInsertCompiler):
# unnest'able (e.g. array and geometry types are known to be
# problematic).
or any(
field.get_internal_type() not in self.connection.data_types
(field.target_field if field.is_relation else field).get_internal_type()
not in self.connection.data_types
for field in fields
)
# Compilable cannot be combined in an array of literal values.

View File

@ -9,4 +9,6 @@ Django 5.2.5 fixes several bugs in 5.2.4.
Bugfixes
========
* ...
* Fixed a regression in Django 5.2.1 that prevented the usage of ``UNNEST``
PostgreSQL strategy of ``QuerySet.bulk_create()`` with foreign keys
(:ticket:`36502`).

View File

@ -1,10 +1,11 @@
import unittest
from datetime import date
from django.db import connection
from django.db.models.expressions import RawSQL
from django.test import TestCase
from ..models import Square
from ..models import Article, Reporter, Square
@unittest.skipUnless(connection.vendor == "postgresql", "PostgreSQL tests")
@ -27,3 +28,17 @@ class BulkCreateUnnestTests(TestCase):
[Square(root=2, square=4), Square(root=3, square=9)]
)
self.assertIn("UNNEST", ctx[0]["sql"])
def test_unnest_eligible_foreign_keys(self):
reporter = Reporter.objects.create()
with self.assertNumQueries(1) as ctx:
articles = Article.objects.bulk_create(
[
Article(pub_date=date.today(), reporter=reporter),
Article(pub_date=date.today(), reporter=reporter),
]
)
self.assertIn("UNNEST", ctx[0]["sql"])
self.assertEqual(
[article.reporter for article in articles], [reporter, reporter]
)