diff --git a/apps/assets/models/node.py b/apps/assets/models/node.py index 617889992..5b7d7f95a 100644 --- a/apps/assets/models/node.py +++ b/apps/assets/models/node.py @@ -8,11 +8,10 @@ from collections import defaultdict from django.core.cache import cache from django.db import models, transaction -from django.db.models import Q, Manager +from django.db.models import F, Q, Manager from django.db.transaction import atomic from django.utils.translation import gettext_lazy as _, gettext -from common.db.models import output_as_string from common.utils import get_logger, timeit from common.utils.lock import DistributedLock from orgs.mixins.models import OrgManager, JMSOrgBaseModel @@ -354,9 +353,9 @@ class NodeAllAssetsMappingMixin: t1 = time.time() with tmp_to_org(org_id): node_ids_key = Node.objects.annotate( - char_id=output_as_string('id') + char_id=F('id') ).values_list('char_id', 'key') - node_ids_key = [(str(uuid.UUID(node_id)), node_key) for node_id, node_key in node_ids_key] + node_ids_key = [(str(node_id), node_key) for node_id, node_key in node_ids_key] node_id_ancestor_keys_mapping = { node_id: cls.get_node_ancestor_keys(node_key, with_self=True) for node_id, node_key in node_ids_key @@ -364,13 +363,13 @@ class NodeAllAssetsMappingMixin: # * 直接取出全部. filter(node__org_id=org_id)(大规模下会更慢) nodes_asset_ids = cls.assets.through.objects.all() \ - .annotate(char_node_id=output_as_string('node_id')) \ - .annotate(char_asset_id=output_as_string('asset_id')) \ + .annotate(char_node_id=F('node_id')) \ + .annotate(char_asset_id=F('asset_id')) \ .values_list('char_node_id', 'char_asset_id') nodeid_assetsid_mapping = defaultdict(set) for node_id, asset_id in nodes_asset_ids: - node_id, asset_id = str(uuid.UUID(node_id)), str(uuid.UUID(asset_id)) + node_id, asset_id = str(node_id), str(asset_id) nodeid_assetsid_mapping[node_id].add(asset_id) t2 = time.time() diff --git a/apps/assets/utils/node.py b/apps/assets/utils/node.py index 2dbc1e4e3..acadfde60 100644 --- a/apps/assets/utils/node.py +++ b/apps/assets/utils/node.py @@ -1,9 +1,9 @@ # ~*~ coding: utf-8 ~*~ # from collections import defaultdict -from uuid import UUID -from common.db.models import output_as_string +from django.db.models import F + from common.struct import Stack from common.utils import get_logger, dict_get_any, is_uuid, get_object_or_none, timeit from common.utils.http import is_true @@ -129,12 +129,12 @@ class NodeAssetsUtil: nodes = list(Node.objects.all()) nodes_assets = Asset.nodes.through.objects.all() \ - .annotate(aid=output_as_string('asset_id')) \ + .annotate(aid=F('asset_id')) \ .values_list('node__key', 'aid') mapping = defaultdict(set) for key, asset_id in nodes_assets: - asset_id = str(UUID(asset_id)) + asset_id = str(asset_id) mapping[key].add(asset_id) util = cls(nodes, mapping) diff --git a/apps/common/db/models.py b/apps/common/db/models.py index a3d51bcb7..ad1b7c473 100644 --- a/apps/common/db/models.py +++ b/apps/common/db/models.py @@ -49,6 +49,7 @@ class JMSBaseModel(BaseCreateUpdateModel): return str(self.id) +# Mysql PostgreSQL incompatible (ce6e5038a6134fad83aba220e6204cf9 ce6e5038-a613-4fad-83ab-a220e6204cf9) def output_as_string(field_name): return ExpressionWrapper(F(field_name), output_field=models.CharField()) diff --git a/apps/perms/utils/user_perm_tree.py b/apps/perms/utils/user_perm_tree.py index 81a72fddc..f89f5cd46 100644 --- a/apps/perms/utils/user_perm_tree.py +++ b/apps/perms/utils/user_perm_tree.py @@ -1,14 +1,13 @@ import time from collections import defaultdict -from uuid import UUID from django.conf import settings from django.core.cache import cache from django.db import transaction +from django.db.models import F from assets.models import Asset from assets.utils import NodeAssetsUtil -from common.db.models import output_as_string from common.decorators import merge_delay_run from common.decorators import on_transaction_commit from common.utils import get_logger @@ -399,11 +398,11 @@ class UserPermTreeBuildUtil(object): asset_node_pairs = Asset.nodes.through.objects \ .filter(asset_id__in=self.direct_asset_ids) \ .annotate( - str_asset_id=output_as_string('asset_id'), - str_node_id=output_as_string('node_id') + str_asset_id=F('asset_id'), + str_node_id=F('node_id') ).values_list('str_asset_id', 'str_node_id') asset_node_pairs = [ - (str(UUID(asset_id)), str(UUID(node_id))) + (str(asset_id), str(node_id)) for asset_id, node_id in asset_node_pairs ] return asset_node_pairs