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元素,并显着提高性能,因为它不必在选择框中加载大量选项.
小智 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)
您还可以在表单中缓存选项传递.
我愿意打赌这个问题是由于你的ForeignKey.默认情况下,django <select>为每个外键呈现一个元素.
如果你有成千上万的行,这很容易开始膨胀你的HTML/DOM,我注意到浏览器开始废弃<select>标签中呈现的20k项目.
要解决此问题,请查看覆盖管理表单而不使用默认小部件.
| 归档时间: |
|
| 查看次数: |
6747 次 |
| 最近记录: |