perf: 支持嵌套创建

pull/8873/head
ibuler 2022-08-08 11:39:55 +08:00
parent c0cb58c001
commit 11d9a0e9cc
2 changed files with 51 additions and 30 deletions

View File

@ -2,9 +2,11 @@
#
from rest_framework import serializers
from django.utils.translation import ugettext_lazy as _
from drf_writable_nested.serializers import WritableNestedModelSerializer
from orgs.mixins.serializers import OrgResourceModelSerializerMixin
from ...models import Asset, Node, Platform, SystemUser, Protocol, Label
from ...models import Asset, Node, Platform, Protocol, Label, Domain
from ..mixin import CategoryDisplayMixin
from ..account import AccountSerializer
@ -24,22 +26,52 @@ class AssetLabelSerializer(serializers.ModelSerializer):
class Meta:
model = Label
fields = ['id', 'name', 'value']
extra_kwargs = {
'value': {'required': False}
}
class AssetSerializer(CategoryDisplayMixin, OrgResourceModelSerializerMixin):
domain_display = serializers.ReadOnlyField(source='domain.name', label=_('Domain name'))
nodes_display = serializers.ListField(
child=serializers.CharField(), label=_('Nodes name'), required=False
)
labels_display = serializers.ListField(
child=serializers.CharField(), label=_('Labels name'),
required=False, read_only=True
)
class AssetPlatformSerializer(serializers.ModelSerializer):
class Meta:
model = Platform
fields = ['id', 'name']
extra_kwargs = {
'name': {'required': False}
}
class AssetDomainSerializer(serializers.ModelSerializer):
class Meta:
model = Domain
fields = ['id', 'name']
class AssetNodesSerializer(serializers.ModelSerializer):
class Meta:
model = Node
fields = ['id', 'value']
extra_kwargs = {
'value': {'required': False}
}
class AssetSerializer(CategoryDisplayMixin, WritableNestedModelSerializer, OrgResourceModelSerializerMixin):
domain = AssetDomainSerializer(required=False)
# nodes_display = serializers.ListField(
# child=serializers.CharField(), label=_('Nodes name'), required=False
# )
labels = AssetLabelSerializer(many=True, required=False)
platform_display = serializers.SlugField(
source='platform.name', label=_("Platform display"), read_only=True
)
accounts = AccountSerializer(many=True, write_only=True, required=False)
# labels_display = serializers.ListField(
# child=serializers.CharField(), label=_('Labels name'),
# required=False, read_only=True
# )
# labels = AssetLabelSerializer(many=True, required=False)
# platform_display = serializers.SlugField(
# source='platform.name', label=_("Platform display"), read_only=True
# )
nodes = AssetNodesSerializer(many=True, required=False)
platform = AssetPlatformSerializer(required=False)
accounts = AccountSerializer(many=True, required=False)
protocols = AssetProtocolsSerializer(many=True)
"""
@ -55,10 +87,12 @@ class AssetSerializer(CategoryDisplayMixin, OrgResourceModelSerializerMixin):
'is_active', 'number', 'comment',
]
fields_fk = [
'domain', 'domain_display', 'platform', 'platform', 'platform_display',
'domain', 'platform', 'platform',
# 'domain_display', 'platform_display',
]
fields_m2m = [
'nodes', 'nodes_display', 'labels', 'labels_display', 'accounts', 'protocols',
'nodes', 'labels', 'accounts', 'protocols',
# 'labels_display','nodes_display',
]
read_only_fields = [
'category', 'category_display', 'type', 'type_display',
@ -78,15 +112,6 @@ class AssetSerializer(CategoryDisplayMixin, OrgResourceModelSerializerMixin):
self.accounts_data = data.pop('accounts', [])
super().__init__(*args, **kwargs)
def get_fields(self):
fields = super().get_fields()
admin_user_field = fields.get('admin_user')
# 因为 mixin 中对 fields 有处理,可能不需要返回 admin_user
if admin_user_field:
admin_user_field.queryset = SystemUser.objects.filter(type=SystemUser.Type.admin)
return fields
def validate_type(self, value):
print(self.initial_data)
return value
@ -126,7 +151,6 @@ class AssetSerializer(CategoryDisplayMixin, OrgResourceModelSerializerMixin):
serializer.save()
def create(self, validated_data):
self.compatible_with_old_protocol(validated_data)
nodes_display = validated_data.pop('nodes_display', '')
instance = super().create(validated_data)
if self.accounts_data:
@ -136,7 +160,6 @@ class AssetSerializer(CategoryDisplayMixin, OrgResourceModelSerializerMixin):
def update(self, instance, validated_data):
nodes_display = validated_data.pop('nodes_display', '')
self.compatible_with_old_protocol(validated_data)
instance = super().update(instance, validated_data)
self.perform_nodes_display_create(instance, nodes_display)
return instance
@ -178,6 +201,3 @@ class AssetTaskSerializer(AssetsTaskSerializer):
asset = serializers.PrimaryKeyRelatedField(
queryset=Asset.objects, required=False, allow_empty=True, many=False
)
system_users = serializers.PrimaryKeyRelatedField(
queryset=SystemUser.objects, required=False, allow_empty=True, many=True
)

View File

@ -74,6 +74,7 @@ djangorestframework==3.13.1
djangorestframework-bulk==0.2.1
django-simple-history==3.1.1
drf-nested-routers==0.93.4
drf-writable-nested==0.6.4
rest_condition==1.0.3
drf-yasg==1.20.0
coreapi==2.3.3