mirror of https://github.com/jumpserver/jumpserver
perf: labels getter and setter for inherite model
parent
6cd3672604
commit
a2d6e41816
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in New Issue