Django - 自定义过滤器或SQL原始

时间:2014-06-08 18:55:23

标签: mysql django django-models django-templates

我有一个模型的应用程序,它有三个实现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)

谢谢, 艾萨克

1 个答案:

答案 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 %}