summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon Charette <charette.s@gmail.com>2019-12-11 22:34:28 -0500
committerMariusz Felisiak <felisiak.mariusz@gmail.com>2019-12-30 08:30:44 +0100
commit7db4ab84394f5ffa588d5d968f6b76178740fb51 (patch)
tree7205b47b298f0bcf8b1a967bc3c8434bc3f78d8f
parent0f8041abd5bf0977d28b676445d35a81c6b7b5de (diff)
[3.0.x] Fixed #31071 -- Disabled insert optimization for primary keys with defaults when loading fixtures.
Model.save_base() is called directly when loading fixtures and assumes existing rows will be updated. Branching of "raw" allows to maintain the optimization introduced in #29260 while supporting this edge case. Regression in 85458e94e38c20e57939947ee515a1a53689659f. Thanks Reupen Shah for the report. Backport of 5779cc938a34eb96815c7a40ded2c8f6c8087c58 from master
-rw-r--r--django/db/models/base.py1
-rw-r--r--docs/releases/3.0.2.txt4
-rw-r--r--tests/serializers/models/data.py6
-rw-r--r--tests/serializers/test_data.py3
4 files changed, 13 insertions, 1 deletions
diff --git a/django/db/models/base.py b/django/db/models/base.py
index 0b8425aa85..3552dc5783 100644
--- a/django/db/models/base.py
+++ b/django/db/models/base.py
@@ -848,6 +848,7 @@ class Model(metaclass=ModelBase):
updated = False
# Skip an UPDATE when adding an instance and primary key has a default.
if (
+ not raw and
not force_insert and
self._state.adding and
self._meta.pk.default and
diff --git a/docs/releases/3.0.2.txt b/docs/releases/3.0.2.txt
index ebb85d1f46..e232fa81f8 100644
--- a/docs/releases/3.0.2.txt
+++ b/docs/releases/3.0.2.txt
@@ -18,3 +18,7 @@ Bugfixes
* Fixed a regression in Django 3.0 that caused a migration crash on PostgreSQL
10+ when adding a foreign key and changing data in the same migration
(:ticket:`31106`).
+
+* Fixed a regression in Django 3.0 where loading fixtures crashed for models
+ defining a :attr:`~django.db.models.Field.default` for the primary key
+ (:ticket:`31071`).
diff --git a/tests/serializers/models/data.py b/tests/serializers/models/data.py
index 533ccf6830..3a55b89c9b 100644
--- a/tests/serializers/models/data.py
+++ b/tests/serializers/models/data.py
@@ -4,6 +4,8 @@ The following classes are for testing basic data marshalling, including
NULL values, where allowed.
The basic idea is to have a model for each Django data type.
"""
+import uuid
+
from django.contrib.contenttypes.fields import (
GenericForeignKey, GenericRelation,
)
@@ -253,6 +255,10 @@ class UUIDData(models.Model):
data = models.UUIDField(primary_key=True)
+class UUIDDefaultData(models.Model):
+ data = models.UUIDField(primary_key=True, default=uuid.uuid4)
+
+
class FKToUUID(models.Model):
data = models.ForeignKey(UUIDData, models.CASCADE)
diff --git a/tests/serializers/test_data.py b/tests/serializers/test_data.py
index 9f0e311d62..0fcde35bd3 100644
--- a/tests/serializers/test_data.py
+++ b/tests/serializers/test_data.py
@@ -26,7 +26,7 @@ from .models import (
ModifyingSaveData, NullBooleanData, O2OData, PositiveIntegerData,
PositiveIntegerPKData, PositiveSmallIntegerData,
PositiveSmallIntegerPKData, SlugData, SlugPKData, SmallData, SmallPKData,
- Tag, TextData, TimeData, UniqueAnchor, UUIDData,
+ Tag, TextData, TimeData, UniqueAnchor, UUIDData, UUIDDefaultData,
)
from .tests import register_tests
@@ -349,6 +349,7 @@ The end."""),
# (pk_obj, 790, XMLPKData, "<foo></foo>"),
(pk_obj, 791, UUIDData, uuid_obj),
(fk_obj, 792, FKToUUID, uuid_obj),
+ (pk_obj, 793, UUIDDefaultData, uuid_obj),
(data_obj, 800, AutoNowDateTimeData, datetime.datetime(2006, 6, 16, 10, 42, 37)),
(data_obj, 810, ModifyingSaveData, 42),