mirror of
https://github.com/jumpserver/jumpserver.git
synced 2025-09-07 10:20:57 +00:00
perf: 支持全局的 labels (#12043)
* perf: 支持全局的 labels * perf: stash * stash * stash * stash * stash * perf: 优化 labels * stash * perf: add debug sql * perf: 修改 labels * perf: 优化提交 * perf: 优化提交 labels * perf: 基本完成 * perf: 完成 labels 搜索 * perf: 优化 labels * perf: 去掉不用 debug --------- Co-authored-by: ibuler <ibuler@qq.com>
This commit is contained in:
54
apps/labels/serializers.py
Normal file
54
apps/labels/serializers.py
Normal file
@@ -0,0 +1,54 @@
|
||||
from django.contrib.contenttypes.models import ContentType
|
||||
from django.db.models import Count
|
||||
from django.utils.translation import gettext_lazy as _
|
||||
from rest_framework import serializers
|
||||
|
||||
from common.serializers.fields import ObjectRelatedField
|
||||
from orgs.mixins.serializers import BulkOrgResourceModelSerializer
|
||||
from .models import Label, LabeledResource
|
||||
|
||||
__all__ = ['LabelSerializer', 'LabeledResourceSerializer', 'ContentTypeResourceSerializer']
|
||||
|
||||
|
||||
class LabelSerializer(BulkOrgResourceModelSerializer):
|
||||
class Meta:
|
||||
model = Label
|
||||
fields = ['id', 'name', 'value', 'res_count', 'date_created', 'date_updated']
|
||||
read_only_fields = ('date_created', 'date_updated', 'res_count')
|
||||
extra_kwargs = {
|
||||
'res_count': {'label': _('Resource count')},
|
||||
}
|
||||
|
||||
@classmethod
|
||||
def setup_eager_loading(cls, queryset):
|
||||
""" Perform necessary eager loading of data. """
|
||||
queryset = queryset.annotate(res_count=Count('labeled_resources'))
|
||||
return queryset
|
||||
|
||||
|
||||
class LabeledResourceSerializer(serializers.ModelSerializer):
|
||||
res_type = ObjectRelatedField(
|
||||
queryset=ContentType.objects, attrs=('app_label', 'model', 'name'), label=_("Resource type")
|
||||
)
|
||||
label = ObjectRelatedField(queryset=Label.objects, attrs=('name', 'value'))
|
||||
resource = serializers.CharField(label=_("Resource"))
|
||||
|
||||
class Meta:
|
||||
model = LabeledResource
|
||||
fields = ('id', 'label', 'res_type', 'res_id', 'date_created', 'resource', 'date_updated')
|
||||
read_only_fields = ('date_created', 'date_updated', 'resource')
|
||||
|
||||
@classmethod
|
||||
def setup_eager_loading(cls, queryset):
|
||||
""" Perform necessary eager loading of data. """
|
||||
queryset = queryset.select_related('label', 'res_type')
|
||||
return queryset
|
||||
|
||||
|
||||
class ContentTypeResourceSerializer(serializers.Serializer):
|
||||
id = serializers.CharField()
|
||||
name = serializers.SerializerMethodField()
|
||||
|
||||
@staticmethod
|
||||
def get_name(obj):
|
||||
return str(obj)
|
Reference in New Issue
Block a user