perf: labels getter and setter for inherite model

This commit is contained in:
ibuler 2024-01-16 14:55:43 +08:00 committed by 老广
parent 6cd3672604
commit a2d6e41816
4 changed files with 14 additions and 10 deletions

View File

@ -206,9 +206,12 @@ class AssetSerializer(BulkOrgResourceModelSerializer, ResourceLabelsMixin, Writa
""" Perform necessary eager loading of data. """ """ Perform necessary eager loading of data. """
queryset = queryset.prefetch_related('domain', 'nodes', 'protocols', ) \ queryset = queryset.prefetch_related('domain', 'nodes', 'protocols', ) \
.prefetch_related('platform', 'platform__automation') \ .prefetch_related('platform', 'platform__automation') \
.prefetch_related('labels', 'labels__label') \
.annotate(category=F("platform__category")) \ .annotate(category=F("platform__category")) \
.annotate(type=F("platform__type")) .annotate(type=F("platform__type"))
if queryset.model is Asset:
queryset = queryset.prefetch_related('labels__label', 'labels')
else:
queryset = queryset.prefetch_related('asset_ptr__labels__label', 'asset_ptr__labels')
return queryset return queryset
@staticmethod @staticmethod

View File

@ -223,7 +223,7 @@ class LabelFilterBackend(filters.BaseFilterBackend):
return queryset return queryset
model = queryset.model.label_model() model = queryset.model.label_model()
labeled_resource_cls = model._labels.field.related_model labeled_resource_cls = model.labels.field.related_model
app_label = model._meta.app_label app_label = model._meta.app_label
model_name = model._meta.model_name model_name = model._meta.model_name

View File

@ -394,7 +394,7 @@ class CommonBulkModelSerializer(CommonBulkSerializerMixin, serializers.ModelSeri
class ResourceLabelsMixin(serializers.Serializer): class ResourceLabelsMixin(serializers.Serializer):
labels = LabelRelatedField(many=True, label=_('Labels'), required=False, allow_null=True) labels = LabelRelatedField(many=True, label=_('Labels'), required=False, allow_null=True, source='res_labels')
def update(self, instance, validated_data): def update(self, instance, validated_data):
labels = validated_data.pop('labels', None) labels = validated_data.pop('labels', None)

View File

@ -2,13 +2,14 @@ from django.contrib.contenttypes.fields import GenericRelation
from django.db import models from django.db import models
from django.db.models import OneToOneField from django.db.models import OneToOneField
from common.utils import lazyproperty
from .models import LabeledResource from .models import LabeledResource
__all__ = ['LabeledMixin'] __all__ = ['LabeledMixin']
class LabeledMixin(models.Model): class LabeledMixin(models.Model):
_labels = GenericRelation(LabeledResource, object_id_field='res_id', content_type_field='res_type') labels = GenericRelation(LabeledResource, object_id_field='res_id', content_type_field='res_type')
class Meta: class Meta:
abstract = True abstract = True
@ -21,7 +22,7 @@ class LabeledMixin(models.Model):
model = pk_field.related_model model = pk_field.related_model
return model return model
@property @lazyproperty
def real(self): def real(self):
pk_field = self._meta.pk pk_field = self._meta.pk
if isinstance(pk_field, OneToOneField): if isinstance(pk_field, OneToOneField):
@ -29,9 +30,9 @@ class LabeledMixin(models.Model):
return self return self
@property @property
def labels(self): def res_labels(self):
return self.real._labels return self.real.labels
@labels.setter @res_labels.setter
def labels(self, value): def res_labels(self, value):
self.real._labels.set(value, bulk=False) self.real.labels.set(value, bulk=False)