Skip to content

Commit f40d278

Browse files
committed
Handle get_prefetch_queryset deprecation for Django 5.0+
The fallback support is removed in Django 6.0 Ref: - django/django@cac94dd - django/django@817bc58
1 parent 4d95dae commit f40d278

File tree

1 file changed

+23
-2
lines changed

1 file changed

+23
-2
lines changed

modelcluster/fields.py

+23-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
from __future__ import unicode_literals
22

3+
from django import VERSION as DJANGO_VERSION
34
from django.core import checks
45
from django.db import IntegrityError, connections, router
56
from django.db.models import CASCADE
@@ -84,7 +85,10 @@ def _apply_rel_filters(self, queryset):
8485
# to work correctly with prefetch
8586
return queryset._next_is_sticky().all()
8687

87-
def get_prefetch_queryset(self, instances, queryset=None):
88+
def get_prefetch_querysets(self, instances, querysets=None):
89+
if querysets and len(querysets) != 1:
90+
raise ValueError("get_prefetch_querysets() must be passed exactly one queryset")
91+
queryset = querysets[0] if querysets else None
8892
if queryset is None:
8993
db = self._db or router.db_for_read(self.model, instance=instances[0])
9094
queryset = super().get_queryset().using(db)
@@ -103,6 +107,13 @@ def get_prefetch_queryset(self, instances, queryset=None):
103107
cache_name = rel_field.related_query_name()
104108
return qs, rel_obj_attr, instance_attr, False, cache_name, False
105109

110+
# Remove once we only support Django 5.0+
111+
if not DJANGO_VERSION >= (5, 0):
112+
def get_prefetch_queryset(self, instances, queryset=None):
113+
if queryset is None:
114+
return self.get_prefetch_querysets(instances)
115+
return self.get_prefetch_querysets(instances, querysets=[queryset])
116+
106117
def get_object_list(self):
107118
"""
108119
return the mutable list that forms the current in-memory state of
@@ -338,8 +349,11 @@ def get_queryset(self):
338349

339350
return FakeQuerySet(rel_model, results)
340351

341-
def get_prefetch_queryset(self, instances, queryset=None):
352+
def get_prefetch_querysets(self, instances, querysets=None):
342353
# Derived from Django's ManyRelatedManager.get_prefetch_queryset.
354+
if querysets and len(querysets) != 1:
355+
raise ValueError("get_prefetch_querysets() must be passed exactly one queryset")
356+
queryset = querysets[0] if querysets else None
343357
if queryset is None:
344358
queryset = super().get_queryset()
345359

@@ -374,6 +388,13 @@ def get_prefetch_queryset(self, instances, queryset=None):
374388
False,
375389
)
376390

391+
# Remove once we only support Django 5.0+
392+
if not DJANGO_VERSION >= (5, 0):
393+
def get_prefetch_queryset(self, instances, queryset=None):
394+
if queryset is None:
395+
return self.get_prefetch_querysets(instances)
396+
return self.get_prefetch_querysets(instances, querysets=[queryset])
397+
377398
def _apply_rel_filters(self, queryset):
378399
# Required for get_prefetch_queryset.
379400
return queryset._next_is_sticky()

0 commit comments

Comments
 (0)