Fixed #35159 -- Fixed dumpdata crash when base querysets use prefetch_related().

Regression in 1391356276
following deprecation in edbf930287.

Thanks Andrea F for the report.
This commit is contained in:
Mariusz Felisiak 2024-01-31 16:10:05 +01:00 committed by GitHub
parent d3922e9e5a
commit 38eaf2f21a
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 30 additions and 1 deletions

View File

@ -219,7 +219,10 @@ class Command(BaseCommand):
if count_only:
yield queryset.order_by().count()
else:
yield from queryset.iterator()
chunk_size = (
2000 if queryset._prefetch_related_lookups else None
)
yield from queryset.iterator(chunk_size=chunk_size)
try:
self.stdout.ending = None

View File

@ -24,3 +24,7 @@ Bugfixes
``FilteredRelation()`` with querysets as right-hand sides (:ticket:`35135`).
``FilteredRelation()`` now raises a ``ValueError`` on querysets as right-hand
sides.
* Fixed a regression in Django 5.0 that caused a crash of the ``dumpdata``
management command when a base queryset used ``prefetch_related()``
(:ticket:`35159`).

View File

@ -101,9 +101,15 @@ class ProxySpy(Spy):
proxy = True
class VisaManager(models.Manager):
def get_queryset(self):
return super().get_queryset().prefetch_related("permissions")
class Visa(models.Model):
person = models.ForeignKey(Person, models.CASCADE)
permissions = models.ManyToManyField(Permission, blank=True)
objects = VisaManager()
def __str__(self):
return "%s %s" % (

View File

@ -830,6 +830,22 @@ class FixtureLoadingTests(DumpDataAssertMixin, TestCase):
)
self.assertEqual(len(warning_list), 0)
def test_dumpdata_objects_with_prefetch_related(self):
management.call_command(
"loaddata", "fixture6.json", "fixture8.json", verbosity=0
)
with self.assertNumQueries(5):
self._dumpdata_assert(
["fixtures.visa"],
'[{"fields": {"permissions": [["add_user", "auth", "user"]],'
'"person": ["Stephane Grappelli"]},'
'"model": "fixtures.visa", "pk": 2},'
'{"fields": {"permissions": [], "person": ["Prince"]},'
'"model": "fixtures.visa", "pk": 3}]',
natural_foreign_keys=True,
primary_keys="2,3",
)
def test_compress_format_loading(self):
# Load fixture 4 (compressed), using format specification
management.call_command("loaddata", "fixture4.json", verbosity=0)