【发布时间】:2021-10-20 03:18:27
【问题描述】:
我正在尝试使用 ViewSet 返回具有资产类型名称(而不仅仅是 id)的所有资产的列表,但根据 django-debug-toolbar,我的查询被重复导致结果变慢。
1 资产类型可以有多个资产。
因此,当我尝试检索所有资产(子项)时,它会尝试获取每个资产(子项)的资产类型(父项)名称,但它正在为每个资产(子项)运行一个查询。看起来像这样:它被重复了 6 次,因为我目前在 Asset 表中有 6 个值。
QUERY = 'SELECT TOP 21 [mm_asset_type].[id], [mm_asset_type].[name], [mm_asset_type].[description] FROM [mm_asset_type] WHERE [mm_asset_type].[id] = %s' - PARAMS = (27,)
6 similar queries. Duplicated 3 times. 3.99
Sel Expl
+
QUERY = 'SELECT TOP 21 [mm_asset_type].[id], [mm_asset_type].[name], [mm_asset_type].[description] FROM [mm_asset_type] WHERE [mm_asset_type].[id] = %s' - PARAMS = (27,)
6 similar queries. Duplicated 3 times. 3.99
Sel Expl
+
QUERY = 'SELECT TOP 21 [mm_asset_type].[id], [mm_asset_type].[name], [mm_asset_type].[description] FROM [mm_asset_type] WHERE [mm_asset_type].[id] = %s' - PARAMS = (27,)
6 similar queries. Duplicated 3 times. 3.00
Sel Expl
+
QUERY = 'SELECT TOP 21 [mm_asset_type].[id], [mm_asset_type].[name], [mm_asset_type].[description] FROM [mm_asset_type] WHERE [mm_asset_type].[id] = %s' - PARAMS = (29,)
6 similar queries. Duplicated 3 times. 3.95
Sel Expl
+
QUERY = 'SELECT TOP 21 [mm_asset_type].[id], [mm_asset_type].[name], [mm_asset_type].[description] FROM [mm_asset_type] WHERE [mm_asset_type].[id] = %s' - PARAMS = (29,)
6 similar queries. Duplicated 3 times. 3.99
Sel Expl
+
QUERY = 'SELECT TOP 21 [mm_asset_type].[id], [mm_asset_type].[name], [mm_asset_type].[description] FROM [mm_asset_type] WHERE [mm_asset_type].[id] = %s' - PARAMS = (29,)
6 similar queries. Duplicated 3 times.
预期输出
我想要的只是所有资产的列表以及资产类型名称——有没有更好的方法来做到这一点?
这是我的模型:
class AssetType(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=80, unique=True)
description = models.CharField(max_length=80)
class Meta:
db_table = "mm_asset_type"
class Asset(models.Model):
asset_type = models.ForeignKey(AssetType, on_delete=models.CASCADE)
asset_name = models.CharField(max_length=80)
display_name = models.CharField(max_length=80)
class Meta:
db_table = "mm_asset_registry"
这是我的序列化程序:
class AssetTypeSerializer(serializers.ModelSerializer):
class Meta:
model = AssetType
fields = "__all__"
class AssetSerializer(serializers.ModelSerializer):
asset_type_name = serializers.CharField(source='asset_type.name')
class Meta:
model = Asset
fields = ("id", "asset_type_name", "asset_name", "display_name")
最后,这是我的 ViewSet
class AssetViewSet(mixins.ListModelMixin,viewsets.GenericViewSet):
queryset = Asset.objects.all()
serializer_class = AssetSerializer
因此,当我尝试检索所有资产时,它会尝试获取每个资产的资产类型名称,但它会为每个资产运行一个查询。看起来像这样:
QUERY = 'SELECT TOP 21 [mm_asset_type].[id], [mm_asset_type].[name], [mm_asset_type].[description] FROM [mm_asset_type] WHERE [mm_asset_type].[id] = %s' - PARAMS = (27,)
6 similar queries. Duplicated 3 times. 3.99
Sel Expl
+
QUERY = 'SELECT TOP 21 [mm_asset_type].[id], [mm_asset_type].[name], [mm_asset_type].[description] FROM [mm_asset_type] WHERE [mm_asset_type].[id] = %s' - PARAMS = (27,)
6 similar queries. Duplicated 3 times. 3.99
Sel Expl
+
QUERY = 'SELECT TOP 21 [mm_asset_type].[id], [mm_asset_type].[name], [mm_asset_type].[description] FROM [mm_asset_type] WHERE [mm_asset_type].[id] = %s' - PARAMS = (27,)
6 similar queries. Duplicated 3 times. 3.00
Sel Expl
+
QUERY = 'SELECT TOP 21 [mm_asset_type].[id], [mm_asset_type].[name], [mm_asset_type].[description] FROM [mm_asset_type] WHERE [mm_asset_type].[id] = %s' - PARAMS = (29,)
6 similar queries. Duplicated 3 times. 3.95
Sel Expl
+
QUERY = 'SELECT TOP 21 [mm_asset_type].[id], [mm_asset_type].[name], [mm_asset_type].[description] FROM [mm_asset_type] WHERE [mm_asset_type].[id] = %s' - PARAMS = (29,)
6 similar queries. Duplicated 3 times. 3.99
Sel Expl
+
QUERY = 'SELECT TOP 21 [mm_asset_type].[id], [mm_asset_type].[name], [mm_asset_type].[description] FROM [mm_asset_type] WHERE [mm_asset_type].[id] = %s' - PARAMS = (29,)
6 similar queries. Duplicated 3 times.
预期输出
我想要的只是所有资产(子)以及 AssetType(父)名称的列表——有没有更好的方法来做到这一点?
谢谢
【问题讨论】:
标签: python django django-models django-views django-debug-toolbar