Django管理员改变表单加载速度很慢

Bre*_*t81 12 python django performance django-models django-admin

我的一个Django网站有以下数据库模型:在Django App中"常见":

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)
Run Code Online (Sandbox Code Playgroud)

在Django App"情景喜剧"中:

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)
Run Code Online (Sandbox Code Playgroud)

简而言之,模型类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)
Run Code Online (Sandbox Code Playgroud)

修改将Foreign Keys更改为IntegerFields,因此它禁用了Django ORM系统中的一些魔法,现在更改表单页面加载速度非常快.我的问题是,什么是"django orm里面的残疾魔法"?什么有可能导致问题?

小智 21

在admin.py中

from django.contrib import admin

class RelationAdmin(admin.ModelAdmin):
       raw_id_fields = ('Media','Particle',)

admin.site.register(Relation, RelationAdmin)
Run Code Online (Sandbox Code Playgroud)

这会在表单中显示一个漂亮的小UI元素,并显着提高性能,因为它不必在选择框中加载大量选项.

  • 谢谢!这个小技巧让我的管理网站变得更加有用! (2认同)
  • 有时您甚至不想编辑管理表单中的字段,仅查看它们,还可以添加`readonly_fields =('Media','Particle',)'。 (2认同)

小智 12

这不是django Orm的魔力.这是Form的魔力.在Model中创建外键时,在ModelForm中,ModelChoiceField会创建具有ForeignKey Model的所有选项.django Admin使用Form的所有属性来创建HTML.所以使用这段代码.

from django import forms
class RelationForm(forms.ModelForm):
    parent = forms.ChoiceField(required=False,
                              choices=Relation.objects.values_list('id', 'name'))
    particle = forms.ChoiceField(required=False,
                              choices=Particle.objects.values_list('id', 'content'))
    media = forms.ChoiceField(required=False,
                              choices=Media.objects.values_list('id', 'name'))

    class Meta:
        model = Relation 
Run Code Online (Sandbox Code Playgroud)

在Admis网站

from django.contrib import admin
class RelationAdmin(admin.ModelAdmin):
    form = RelationForm
    model = Relation
Run Code Online (Sandbox Code Playgroud)

您还可以在表单中缓存选项传递.


Yuj*_*ita 8

我愿意打赌这个问题是由于你的ForeignKey.默认情况下,django <select>为每个外键呈现一个元素.

如果你有成千上万的行,这很容易开始膨胀你的HTML/DOM,我注意到浏览器开始废弃<select>标签中呈现的20k项目.

要解决此问题,请查看覆盖管理表单而不使用默认小部件.