1
1
from __future__ import unicode_literals
2
2
3
+ from django import VERSION as DJANGO_VERSION
3
4
from django .core import checks
4
5
from django .db import IntegrityError , connections , router
5
6
from django .db .models import CASCADE
@@ -84,7 +85,10 @@ def _apply_rel_filters(self, queryset):
84
85
# to work correctly with prefetch
85
86
return queryset ._next_is_sticky ().all ()
86
87
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
88
92
if queryset is None :
89
93
db = self ._db or router .db_for_read (self .model , instance = instances [0 ])
90
94
queryset = super ().get_queryset ().using (db )
@@ -103,6 +107,13 @@ def get_prefetch_queryset(self, instances, queryset=None):
103
107
cache_name = rel_field .related_query_name ()
104
108
return qs , rel_obj_attr , instance_attr , False , cache_name , False
105
109
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
+
106
117
def get_object_list (self ):
107
118
"""
108
119
return the mutable list that forms the current in-memory state of
@@ -338,8 +349,11 @@ def get_queryset(self):
338
349
339
350
return FakeQuerySet (rel_model , results )
340
351
341
- def get_prefetch_queryset (self , instances , queryset = None ):
352
+ def get_prefetch_querysets (self , instances , querysets = None ):
342
353
# 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
343
357
if queryset is None :
344
358
queryset = super ().get_queryset ()
345
359
@@ -374,6 +388,13 @@ def get_prefetch_queryset(self, instances, queryset=None):
374
388
False ,
375
389
)
376
390
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
+
377
398
def _apply_rel_filters (self , queryset ):
378
399
# Required for get_prefetch_queryset.
379
400
return queryset ._next_is_sticky ()
0 commit comments