Django快速加载表单

2024-04-24 05:52:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个名为modelTitle,其中包含一些ForeignKey字段:

class Title(models.Model):
    name = models.CharField(max_length=120)
    department = models.ForeignKey('Department')
    rank = models.ForeignKey('Title_rank')

我有一个form,它的参数choices设置为所有Title项:

class Emp_titleForm(forms.Form):

    title = forms.MultipleChoiceField(
                choices=( (x.id, x.department.name + " - " + x.name) for x in Titles.objects.all() ),
                widget=forms.SelectMultiple(),
                required=True,
            )

页面加载很好,但是速度很慢(~6-10秒),因为Title类中有很多对象(目前约5000个)。你知道吗

有没有调整我的formmodel来加速页面加载?不幸的是,过滤以减少选择并不是一种选择。另外,请注意,我想显示带有titledepartment(例如:“Dept-Title”)


Tags: nameformmodeltitlemodelsforms页面class
2条回答

解决这个问题的标准Django方法(不依赖于版本)是在Title模型中创建一个属性:

class Title(models.Model):
    name = models.CharField(max_length=120)
    department = models.ForeignKey('Department')
    rank = models.ForeignKey('Title_rank')

    @property
    def department_name(self):
        return u'%s-%s' % (self.department, self.name)

然后可以在表单中直接引用它。祝你好运。你知道吗

更新

如注释中所述,不能对模型属性执行查找。首先需要使用save()方法将此字段添加到模型中,然后可以执行筛选:

class Title(models.Model):
    name = models.CharField(max_length=120)
    department = models.ForeignKey('Department')
    rank = models.ForeignKey('Title_rank')

    def save(self, *args, **kwargs):
        self.department_name = u'%s-%s' % (self.department, self.name)
        super(Title, self).save(*args, **kwargs)
(x.id, x.name) for x in Titles.objects.all()

不要在所有Title对象上循环,请尝试更有效的查询:

Title.objects.values_list('id', 'name')

编辑:

要组合字段,假设您使用的是Django 1.8+,可以执行以下操作:

from django.db.models import Concat, Value
Title.objects.annotate(
    department_name=Concat('department__name', Value(' - '), 'name')
).values_lists('id', 'department_name')

相关问题 更多 >