Coverage for utilities/prefetch.py: 22%

17 statements  

« prev     ^ index     » next       coverage.py v7.15.2, created at 2026-10-10 18:35 +0000

1from django.contrib.contenttypes.fields import GenericRelation 

2from django.db.models import ManyToManyField 

3from django.db.models.fields.related import ForeignObjectRel 

4from taggit.managers import TaggableManager 

5 

6__all__ = ( 

7 'get_prefetchable_fields', 

8) 

9 

10 

11def get_prefetchable_fields(model): 

12 """ 

13 Return a list containing the names of all fields on the given model which support prefetching. 

14 """ 

15 field_names = [] 

16 

17 for field in model._meta.get_fields(): 

18 # Forward relations (e.g. ManyToManyFields) 

19 if isinstance(field, ManyToManyField): 

20 field_names.append(field.name) 

21 

22 # Reverse relations (e.g. reverse ForeignKeys, reverse M2M) 

23 elif isinstance(field, ForeignObjectRel): 

24 field_names.append(field.get_accessor_name()) 

25 

26 # Generic relations 

27 elif isinstance(field, GenericRelation): 

28 field_names.append(field.name) 

29 

30 # Tags 

31 elif isinstance(field, TaggableManager): 

32 field_names.append(field.name) 

33 

34 return field_names