私の Django ウェブサイトの 1 つには、次のデータベース モデルがあります。Django アプリの「common」では次のようになります。
class Collection(models.Model):
name = models.CharField(max_length = 255, unique = True)
_short_name = models.CharField(db_column="short_name", max_length = 32, blank=True)
class Particle(models.Model):
content = models.TextField(blank=False)
owner = models.ForeignKey(Collection)
order = models.IntegerField(null=True, blank=True)
Django アプリ「シットコム」の場合:
class Media(models.Model):
name = models.CharField(max_length = 248)
_short_name = models.CharField(db_column="short_name", max_length = 32, blank=True)
capital = models.CharField(max_length = 1)
description = models.TextField(blank=True)
progress = models.CharField(max_length = 32, blank=True, null=True)
class Relation(models.Model):
name = models.CharField(max_length = 128)
_short_name = models.CharField(db_column="short_name", max_length = 32, blank=True)
description = models.TextField(blank=True)
parent = models.ForeignKey('self', blank=True, null=True)
order = models.IntegerField(blank=True, null=True)
particle = models.ForeignKey(Particle, blank=True, null=True)
media = models.ForeignKey(Media, blank=True, null=True)
つまり、モデル クラス Relation には他のテーブルへの外部キーが 3 つあります。問題は、Django Admin を使用して単一の Relation を変更すると、ページ (change_form) の読み込みがかなり遅くなることです。その後、モデル クラス Relation を次のように変更しました。
class Relation(models.Model):
name = models.CharField(max_length = 128)
_short_name = models.CharField(db_column="short_name", max_length = 32, blank=True)
description = models.TextField(blank=True)
order = models.IntegerField(blank=True, null=True)
parent_id = models.IntegerField(blank=True, null=True)
particle_id = models.IntegerField(blank=True, null=True)
media_id = models.IntegerField(blank=True, null=True)
この変更により、外部キーが IntegerFields に変更されたため、Django ORM システム内の一部のマジックが無効になり、変更フォーム ページが非常に速く読み込まれるようになりました。私の質問は、「Django ORM 内の無効なマジック」とは何ですか? 何が問題を引き起こす可能性がありますか?
ベストアンサー1
admin.py内
from django.contrib import admin
class RelationAdmin(admin.ModelAdmin):
raw_id_fields = ('Media','Particle',)
admin.site.register(Relation, RelationAdmin)
これにより、フォーム内に小さな UI 要素が表示され、選択ボックスに膨大な数のオプションを読み込む必要がなくなるため、パフォーマンスが大幅に向上します。