perf: labels getter and setter for inherite model

pull/12552/head
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. """
queryset = queryset.prefetch_related('domain', 'nodes', 'protocols', ) \
.prefetch_related('platform', 'platform__automation') \
.prefetch_related('labels', 'labels__label') \
.annotate(category=F("platform__category")) \
.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
@staticmethod

View File

@ -223,7 +223,7 @@ class LabelFilterBackend(filters.BaseFilterBackend):
return queryset
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
model_name = model._meta.model_name

View File

@ -394,7 +394,7 @@ class CommonBulkModelSerializer(CommonBulkSerializerMixin, serializers.ModelSeri
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):
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.models import OneToOneField
from common.utils import lazyproperty
from .models import LabeledResource
__all__ = ['LabeledMixin']
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:
abstract = True
@ -21,7 +22,7 @@ class LabeledMixin(models.Model):
model = pk_field.related_model
return model
@property
@lazyproperty
def real(self):
pk_field = self._meta.pk
if isinstance(pk_field, OneToOneField):
@ -29,9 +30,9 @@ class LabeledMixin(models.Model):
return self
@property
def labels(self):
return self.real._labels
def res_labels(self):
return self.real.labels
@labels.setter
def labels(self, value):
self.real._labels.set(value, bulk=False)
@res_labels.setter
def res_labels(self, value):
self.real.labels.set(value, bulk=False)