summaryrefslogtreecommitdiff
path: root/tests/serializers
diff options
context:
space:
mode:
authorErica Pisani <erica.pisani@floatcard.com>2024-12-18 09:03:02 +0100
committerSarah Boyce <42296566+sarahboyce@users.noreply.github.com>2024-12-18 10:39:20 +0100
commit20f9f6180531279785ceabed6ab2f29ab634d8dc (patch)
tree63439d6393edb4d802903b9160fa8fef25063df3 /tests/serializers
parenta8b70aeffd41d082d4bd8f99c777f37b6a58da66 (diff)
Fixed #35996 -- Fixed database serialization crash when serializing a many-to-many field that had a prefetch.
Diffstat (limited to 'tests/serializers')
-rw-r--r--tests/serializers/tests.py37
1 files changed, 33 insertions, 4 deletions
diff --git a/tests/serializers/tests.py b/tests/serializers/tests.py
index 420246db0b..9e6bb762c9 100644
--- a/tests/serializers/tests.py
+++ b/tests/serializers/tests.py
@@ -7,6 +7,7 @@ from django.core import serializers
from django.core.serializers import SerializerDoesNotExist
from django.core.serializers.base import ProgressBar
from django.db import connection, transaction
+from django.db.models import Prefetch
from django.http import HttpResponse
from django.test import SimpleTestCase, override_settings, skipUnlessDBFeature
from django.test.utils import Approximate
@@ -18,6 +19,7 @@ from .models import (
AuthorProfile,
BaseModel,
Category,
+ CategoryMetaData,
Child,
ComplexModel,
Movie,
@@ -275,18 +277,45 @@ class SerializersTestBase:
serializers.serialize(self.serializer_name, [mv])
def test_serialize_prefetch_related_m2m(self):
- # One query for the Article table and one for each prefetched m2m
- # field.
- with self.assertNumQueries(4):
+ # One query for the Article table, one for each prefetched m2m
+ # field, and one extra one for the nested prefetch for the Topics
+ # that have a relationship to the Category.
+ with self.assertNumQueries(5):
serializers.serialize(
self.serializer_name,
- Article.objects.prefetch_related("categories", "meta_data", "topics"),
+ Article.objects.prefetch_related(
+ "meta_data",
+ "topics",
+ Prefetch(
+ "categories",
+ queryset=Category.objects.prefetch_related("topic_set"),
+ ),
+ ),
)
# One query for the Article table, and three m2m queries for each
# article.
with self.assertNumQueries(7):
serializers.serialize(self.serializer_name, Article.objects.all())
+ def test_serialize_prefetch_related_m2m_with_natural_keys(self):
+ # One query for the Article table, one for each prefetched m2m
+ # field, and a query to get the categories for each Article (two in
+ # total).
+ with self.assertNumQueries(5):
+ serializers.serialize(
+ self.serializer_name,
+ Article.objects.prefetch_related(
+ Prefetch(
+ "meta_data",
+ queryset=CategoryMetaData.objects.prefetch_related(
+ "category_set"
+ ),
+ ),
+ "topics",
+ ),
+ use_natural_foreign_keys=True,
+ )
+
def test_serialize_with_null_pk(self):
"""
Serialized data with no primary key results