Django加载形式更快

时间:2017-05-02 19:10:45

标签: python django

我有一个名为model的{​​{1}},其中包含一些Title字段:

ForeignKey

我有一个class Title(models.Model): name = models.CharField(max_length=120) department = models.ForeignKey('Department') rank = models.ForeignKey('Title_rank') ,其参数form设置为所有choices条目:

Title

页面加载正常,但很慢(约6-10秒)(我假设)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, ) 类中有很多对象(目前约为5,000)。

是否还要调整我的 Title form 来加快页面加载速度?不幸的是,过滤以减少选择不是一种选择。另请注意,我希望model显示department(例如:"部门 - 标题")

2 个答案:

答案 0 :(得分:2)

(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')

答案 1 :(得分:0)

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

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)