2
0
mirror of https://github.com/inventree/InvenTree.git synced 2025-12-16 17:28:11 +00:00

Add a generic way to back-annotate and prefetch parameters for any model type

This commit is contained in:
Oliver Walters
2025-11-25 01:08:38 +00:00
parent 5771cfa20d
commit d0c2ecb3ed

View File

@@ -7,7 +7,6 @@ from typing import Any, Optional
from django.contrib.auth import get_user_model from django.contrib.auth import get_user_model
from django.contrib.contenttypes.fields import GenericRelation from django.contrib.contenttypes.fields import GenericRelation
from django.contrib.contenttypes.models import ContentType
from django.core.exceptions import ValidationError from django.core.exceptions import ValidationError
from django.db import models from django.db import models
from django.db.models import QuerySet from django.db.models import QuerySet
@@ -512,13 +511,36 @@ class InvenTreeParameterMixin(InvenTreePermissionCheckMixin, models.Model):
'common.Parameter', content_type_field='model_type', object_id_field='model_id' 'common.Parameter', content_type_field='model_type', object_id_field='model_id'
) )
@property @staticmethod
def parameters(self) -> QuerySet: def annotate_parameters(queryset: QuerySet) -> QuerySet:
"""Return a QuerySet containing all the Parameter instances for this model.""" """Annotate a queryset with pre-fetched parameters.
Args:
queryset: Queryset to annotate
Returns:
Annotated queryset
"""
from common.models import Parameter from common.models import Parameter
content_type = ContentType.objects.get_for_model(self.__class__) return queryset.prefetch_related(
return Parameter.objects.filter(model_type=content_type, model_id=self.pk) models.Prefetch(
'parameters_list',
queryset=Parameter.objects.all().select_related('template'),
to_attr='parameters_list_prefetched',
)
)
@property
def parameters(self) -> QuerySet:
"""Return a QuerySet containing all the Parameter instances for this model.
This will return pre-fetched data if available (i.e. in a serializer context).
"""
if hasattr(self, 'parameters_list_prefetched'):
return self.parameters_list_prefetched
return self.parameters_list.all()
def delete(self, *args, **kwargs): def delete(self, *args, **kwargs):
"""Handle the deletion of a model instance. """Handle the deletion of a model instance.