DjangoAdminで重大なパフォーマンスの問題が発生しています。
他の2つのモードの主キーをマッピングするマッピングモデルがあります
FundManagerMappingAdminで、2つのテーブルの外部キーを外部キーモデルのラベルで表現しようとしています。
基礎となるモデルは約4000行です
adminでリストを取得するとき、および編集と更新を行うときにパフォーマンスが低下します
誰かがこのコードの非効率性を指摘してもらえますか?
もっと良い方法はありますか?
Admin.py
@admin.register(ChampDwDimFundManagerMapping)
class FundManagerMappingAdmin(admin.ModelAdmin):
list_display = ['get_champ_fund_manager_id', 'get_evestment_name', 'get_sharepoint_name', ]
def get_champ_fund_manager_id(self, obj):
return obj.fund_manager_id
get_champ_fund_manager_id.short_description = 'CHAMP Manager ID'
def get_evestment_name(self, obj):
return obj.evestment_fund_manager_id.manager_name
get_evestment_name.short_description = 'Evestment Manager Name'
def get_sharepoint_name(self, obj):
return obj.sharepoint_fund_manager_id.manager_name
get_sharepoint_name.short_description = 'Sharepoint Manager Name'
def get_form(self, request, obj=None, **kwargs):
form = super(ChampFundManagerMappingAdmin, self).get_form(request, obj, **kwargs)
form.base_fields['sharepoint_fund_manager_id'].label_from_instance = lambda obj: "{} {}".format(obj.final_publications_fund_manager_id, obj.manager_name)
form.base_fields['evestment_fund_manager_id'].label_from_instance = lambda obj: "{} {}".format(obj.evestment_fundmanager_id_bk, obj.manager_name)
return form
Models.py
class FundManagerMapping(models.Model):
fund_manager_id = models.AutoField(db_column='FundManagerId', primary_key=True)
sharepoint_fund_manager_id = models.ForeignKey(SharePointFundManager, models.DO_NOTHING, db_column='SharePointFundManagerId')
evestment_fund_manager_id = models.ForeignKey(EvestmentFundManager, models.DO_NOTHING, db_column='eVestmentFundManagerId')
class EvestmentFundManager(models.Model):
evestment_fund_manager_id = models.AutoField(db_column='eVestmentFundManagerId', primary_key=True)
package_execution_id = models.IntegerField(db_column='PackageExecutionId')
evestment_fund_manager_id_bk = models.CharField(db_column='eVestmentFundManagerId_BK', max_length=50)
manager_name = models.CharField(db_column='ManagerName', max_length=255)
class SharePointFundManager(models.Model):
sharepoint_fund_manager_id = models.AutoField(db_column='SharePointFundManagerId', primary_key=True)
package_execution_id = models.IntegerField(db_column='PackageExecutionId')
research_fund_manager_id = models.CharField(db_column='ResearchFundManagerId', max_length=50, blank=True, null=True)
final_publications_fund_manager_id = models.CharField(db_column='FinalPublicationsFundManagerId', max_length=50, blank=True, null=True)
manager_name = models.CharField(db_column='ManagerName', max_length=255)
あなたは、表示されているname
関連するエンティティ(のためのget_evestment_name
、およびget_sharepoint_name
それらをプリフェッチ/参加せず)を。つまり、表示するすべての行と関連するエンティティのすべての名前について、データベースクエリを作成するためにdjangoが必要です。をオーバーライドget_queryset()
し、ModelAdmin
を使用select_related
してdjangoに最初からこれらのエンティティに参加するように指示して、これらの名前を取得するために追加のクエリを必要としないようにする必要があります。
@admin.register(ChampDwDimFundManagerMapping)
class FundManagerMappingAdmin(admin.ModelAdmin):
def get_queryset(self, request):
return super().get_queryset(request).select_related(
'sharepoint_fund_manager_id',
'evestment_fund_manager_id',
)
また、ForeignKey
フィールドに名前を付けませんsomething_id
。これは、sharepoint_fund_manager
呼び出したときに取得するのがfund_manager.sharepoint_fund_manager_id
IDではなくのインスタンスであるためSharePointFundManager
です。と呼ぶのは変sharepoint_fund_manager_id.name
です。IDにはname属性がありません。ファンドマネージャーは持っています。
さらにsharepoint_fund_manager_id
、フィールドsharepoint_fund_manager
を呼び出してプレーン外部キーにアクセスすると、Djangoは自動的にプロパティを作成します。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加