mirror of
https://github.com/inventree/InvenTree.git
synced 2025-09-13 14:11:37 +00:00
Fix N+1 Query for primary_address in Company API (#10171)
* Enhance CompanySerializer to use Prefetch for for better performance * Refactor CompanySerializer to improve address handling and add schema fields * implement changes suggested by joe Co-authored-by: Joe Rogers <1337joe@users.noreply.github.com> * Update src/backend/InvenTree/company/serializers.py Co-authored-by: Joe Rogers <1337joe@users.noreply.github.com> * Update src/backend/InvenTree/company/serializers.py Co-authored-by: Joe Rogers <1337joe@users.noreply.github.com> --------- Co-authored-by: Matthias Mair <code@mjmair.com> Co-authored-by: Joe Rogers <1337joe@users.noreply.github.com>
This commit is contained in:
@@ -3,8 +3,10 @@
|
|||||||
import io
|
import io
|
||||||
|
|
||||||
from django.core.files.base import ContentFile
|
from django.core.files.base import ContentFile
|
||||||
|
from django.db.models import Prefetch
|
||||||
from django.utils.translation import gettext_lazy as _
|
from django.utils.translation import gettext_lazy as _
|
||||||
|
|
||||||
|
from drf_spectacular.utils import extend_schema_field
|
||||||
from rest_framework import serializers
|
from rest_framework import serializers
|
||||||
from sql_util.utils import SubqueryCount
|
from sql_util.utils import SubqueryCount
|
||||||
from taggit.serializers import TagListSerializerField
|
from taggit.serializers import TagListSerializerField
|
||||||
@@ -161,17 +163,37 @@ class CompanySerializer(
|
|||||||
|
|
||||||
queryset = queryset.annotate(address_count=SubqueryCount('addresses'))
|
queryset = queryset.annotate(address_count=SubqueryCount('addresses'))
|
||||||
|
|
||||||
|
queryset = queryset.prefetch_related(
|
||||||
|
Prefetch(
|
||||||
|
'addresses',
|
||||||
|
queryset=Address.objects.filter(primary=True),
|
||||||
|
to_attr='primary_address_list',
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
return queryset
|
return queryset
|
||||||
|
|
||||||
address = serializers.CharField(
|
address = serializers.SerializerMethodField(
|
||||||
label=_(
|
label=_(
|
||||||
'Return the string representation for the primary address. This property exists for backwards compatibility.'
|
'Return the string representation for the primary address. This property exists for backwards compatibility.'
|
||||||
),
|
),
|
||||||
allow_null=True,
|
allow_null=True,
|
||||||
read_only=True,
|
|
||||||
)
|
)
|
||||||
|
primary_address = serializers.SerializerMethodField(allow_null=True)
|
||||||
|
|
||||||
primary_address = AddressSerializer(allow_null=True, read_only=True)
|
@extend_schema_field(serializers.CharField())
|
||||||
|
def get_address(self, obj):
|
||||||
|
"""Return string version of primary address (for backwards compatibility)."""
|
||||||
|
if hasattr(obj, 'primary_address_list') and obj.primary_address_list:
|
||||||
|
return str(obj.primary_address_list[0])
|
||||||
|
return None
|
||||||
|
|
||||||
|
@extend_schema_field(AddressSerializer())
|
||||||
|
def get_primary_address(self, obj):
|
||||||
|
"""Return full address object for primary address using prefetch data."""
|
||||||
|
if hasattr(obj, 'primary_address_list') and obj.primary_address_list:
|
||||||
|
return AddressSerializer(obj.primary_address_list[0]).data
|
||||||
|
return None
|
||||||
|
|
||||||
image = InvenTreeImageSerializerField(required=False, allow_null=True)
|
image = InvenTreeImageSerializerField(required=False, allow_null=True)
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user