Coverage for apis_core/search/serializers.py: 33%

15 statements  

« prev     ^ index     » next       coverage.py v7.16.1, created at 2026-10-28 13:07 +0000

1from django.core.serializers.json import Serializer 

2from django.db.models import ForeignKey 

3 

4 

5class SearchSerializer(Serializer): 

6 """ 

7 This serializer is based on the default JSON serializer shipped in Django core. 

8 The only change is, that is serializes m2m fields as list of string representations 

9 instead of list of ids and that it serializes foreign keys as the string 

10 representation of the object they point to. 

11 """ 

12 

13 def handle_m2m_field(self, obj, field): 

14 """This is copied from the parent class, only the last line was changed""" 

15 if field.remote_field.through._meta.auto_created: 

16 

17 def queryset_iterator(obj, field): 

18 query_set = getattr(obj, field.name).select_related(None).only("pk") 

19 chunk_size = 2000 if query_set._prefetch_related_lookups else None 

20 return query_set.iterator(chunk_size=chunk_size) 

21 

22 m2m_iter = getattr(obj, "_prefetched_objects_cache", {}).get( 

23 field.name, 

24 queryset_iterator(obj, field), 

25 ) 

26 self._current[field.name] = ", ".join( 

27 [str(related) for related in m2m_iter] 

28 ) 

29 

30 def handle_fk_field(self, obj, field): 

31 """We handle foreign keys in a special way, to get their value serialized""" 

32 if isinstance(field, ForeignKey): 

33 return getattr(obj, field.name) 

34 return super().handle_fk_field(obj, field)