我有一个带有模型的应用程序,该模型具有实现 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 = "nnn"的映射表中的所有 skillid,查询速度非常快。
我想知道最好的方法是什么,因为我想要这样的东西:
{% for job in jobs %}
<p>{{ job.job_title }}</p>
{{ print all skills for job.job_id}}
{% endwith %}
我试过使用自定义过滤器,但我无法让上面的代码工作,因为我似乎必须从 for skillmaps foor lop 中过滤一个值,这只是同一个问题。 是否可以使用原始查询定义一个类并从模板中的 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)
谢谢, 艾萨克
最佳答案
这不是一个非常干净的解决方案,但您可以在您的 View 中一次获取所有 SkillMap
,创建一个以 job_id
作为键的字典,然后将它们注入(inject) 工作
: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 %}
关于mysql - Django——自定义过滤器或 SQL raw,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24109688/