我有一个名为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
(例如:"部门 - 标题")
答案 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)