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
« 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
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 """
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:
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)
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 )
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)