mysql - Django——自定义过滤器或 SQL raw

标签 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 = "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/

相关文章:

mysql - 自引用表时删除数据

python - 类型错误 : not enough arguments for format string in python

php - Mysql 从 2 个表中的 2 列进行全搜索

Django-Deterministic = True在运行python manage.py runserver时需要SQLite 3.8.3或更高版本

Django:或查询动态字段名称

python - 多对多关系中带有附加字段的 Django 管理表单

mysql select 给出一列中与另一列的任何行匹配的所有行?

django - 在 django-registration 中使用电子邮件作为用户名

django - 在 Django Rest Framework 中序列化多对多中间表

python - 以 10 为基数的 int() 模型 Django 无效文字 : 'None'