我有一个模型的应用程序,它有三个实现toxi标记模型的表。 一个工作表,一个技能表和一个表来映射它们,以jobid - skillid的形式。
如果我使用以下内容,由于映射的数量:
{% for job in jobs %}
<p>{{ job.job_title }}</p>
{% for skill in skillmaps %}
{% if job.id == skill.job_id.id %}
#{{ skill.skill_id|title }}
{% endif %}
{% endfor %}
{% endwith %}
它只是简单地使用所有处理器,需要很长时间,大约30分钟。
如果我在数据库中查询映射表中jobid =&#34; nnn&#34;的所有技能,则查询速度非常快。
我想知道什么是最好的方法,因为我想要这样的东西:
{% for job in jobs %}
<p>{{ job.job_title }}</p>
{{ print all skills for job.job_id}}
{% endwith %}
我尝试使用自定义过滤器,但我无法获得上面的代码,因为我似乎必须过滤掉技能图中的值,这只是它的优点一样的问题。 是否可以使用原始查询定义类并从模板中的for循环传递变量? 或者最好的方法是什么?
模特:
class Job(models.Model):
job_title = models.CharField(max_length=200)
job_identifier = models.CharField(max_length=140)
job_site = models.URLField(max_length=200)
job_url = models.URLField(max_length=400)
job_salary = models.PositiveIntegerField(default=0, blank=True, null=True)
def __unicode__(self):
return self.job_title[:200]
class Skill(models.Model):
skill_name = models.CharField(max_length=200)
def __unicode__(self):
return self.skill_name[:200]
class SkillMap(models.Model):
job_id = models.ForeignKey(Job)
skill_id = models.ForeignKey(Skill)
def get_skills_mod(self, *args):
return SkillMap.objects.filter(job_id = args)
谢谢, 艾萨克
答案 0 :(得分:1)
这不是一个非常干净的解决方案,但您可以在视图中一次性获取所有SkillMap
,创建一个以job_id
为键的字典,然后将其注入Job
:p
from collections import defaultdict
def my_view(request):
skills = SkillMap.objects.all()
skills_dict = defaultdict(list)
for x in skills:
skills_dict[x.job_id].append(x)
jobs = Job.objects.all()
for job in jobs:
job.injected_skills = skills_dict.get(job.id, [])
template_context = {
'jobs': jobs,
}
模板:
{% for job in jobs %}
<p>{{ job.job_title }}</p>
{% for skill in job.injected_skills %}
{{ skill }}
{% endfor %}
{% endwith %}