mirror of https://github.com/jumpserver/jumpserver
				
				
				
			[Update] 优化user group serializer
							parent
							
								
									b6f5b335bd
								
							
						
					
					
						commit
						f8c323cf5c
					
				| 
						 | 
				
			
			@ -1,7 +1,7 @@
 | 
			
		|||
# -*- coding: utf-8 -*-
 | 
			
		||||
#
 | 
			
		||||
from django.utils.translation import ugettext_lazy as _
 | 
			
		||||
 | 
			
		||||
from django.db.models import Prefetch
 | 
			
		||||
from rest_framework import serializers
 | 
			
		||||
 | 
			
		||||
from common.serializers import AdaptedBulkListSerializer
 | 
			
		||||
| 
						 | 
				
			
			@ -18,15 +18,18 @@ __all__ = [
 | 
			
		|||
class UserGroupSerializer(BulkOrgResourceModelSerializer):
 | 
			
		||||
    users = serializers.PrimaryKeyRelatedField(
 | 
			
		||||
        required=False, many=True, queryset=User.objects, label=_('User'),
 | 
			
		||||
        # write_only=True, group can return many to many on detail
 | 
			
		||||
        # write_only=True, # group can return many to many on detail
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
    class Meta:
 | 
			
		||||
        model = UserGroup
 | 
			
		||||
        list_serializer_class = AdaptedBulkListSerializer
 | 
			
		||||
        fields = [
 | 
			
		||||
            'id', 'name',  'users', 'users_amount', 'comment',
 | 
			
		||||
            'date_created', 'created_by',
 | 
			
		||||
        fields_mini = ['id', 'name']
 | 
			
		||||
        fields_small = fields_mini + [
 | 
			
		||||
            'comment', 'date_created', 'created_by'
 | 
			
		||||
        ]
 | 
			
		||||
        fields = fields_mini + fields_small + [
 | 
			
		||||
            'users', 'users_amount',
 | 
			
		||||
        ]
 | 
			
		||||
        extra_kwargs = {
 | 
			
		||||
            'created_by': {'label': _('Created by'), 'read_only': True}
 | 
			
		||||
| 
						 | 
				
			
			@ -50,5 +53,7 @@ class UserGroupSerializer(BulkOrgResourceModelSerializer):
 | 
			
		|||
    @classmethod
 | 
			
		||||
    def setup_eager_loading(cls, queryset):
 | 
			
		||||
        """ Perform necessary eager loading of data. """
 | 
			
		||||
        queryset = queryset.annotate(users_amount=Count('users'))
 | 
			
		||||
        queryset = queryset.prefetch_related(
 | 
			
		||||
            Prefetch('users', queryset=User.objects.only('id'))
 | 
			
		||||
        ).annotate(users_amount=Count('users'))
 | 
			
		||||
        return queryset
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue