如何编写Django的views.py,用QuerySet筛选仅存在于Job模型的title
实现思路与代码示例
要找出仅存在于Job模型中、但未出现在EmployeeProfile模型里的title字段值,我们可以通过Django ORM的集合过滤来高效实现,具体步骤如下:
1. 编写视图函数(views.py)
首先导入所需模型,然后通过两步查询完成筛选:
- 第一步:提取所有
EmployeeProfile中的title并去重,转为集合(集合的成员检查效率远高于列表) - 第二步:用上述集合过滤
Job模型,排除掉那些title已存在于员工档案中的职位
from django.shortcuts import render from .models import Job, EmployeeProfile def unique_job_titles(request): # 获取所有员工档案中存在的title,排除空值并去重 existing_titles = set( EmployeeProfile.objects .exclude(title__isnull=True) .exclude(title='') .values_list('title', flat=True) ) # 筛选出Job中不在existing_titles里的title,同样去重 job_titles_only = Job.objects.exclude(title__in=existing_titles).values_list('title', flat=True).distinct() # 如果需要返回完整的Job对象(而不只是title字符串),可以用下面这行替代 # jobs_only = Job.objects.exclude(title__in=existing_titles) context = { 'job_titles_only': job_titles_only, # 若返回完整对象则传 'jobs_only': jobs_only } return render(request, 'job_templates/unique_titles.html', context)
2. 模板渲染示例(HTML)
假设你创建了名为unique_titles.html的模板,遍历结果的代码如下:
<h2>职位标题(仅存在于职位库,未出现在员工档案)</h2> {% if job_titles_only %} <ul> {% for title in job_titles_only %} <li>{{ title }}</li> {% endfor %} </ul> {% else %} <p>所有职位标题都已存在于员工档案中</p> {% endif %}
关键细节说明
values_list('title', flat=True):提取指定字段的扁平列表,避免返回嵌套的元组exclude(title__in=existing_titles):Django ORM的排除查询,精准过滤掉已存在的title- 额外的
exclude(title__isnull=True)和exclude(title=''):避免空字符串或null值干扰过滤结果 .distinct():确保最终结果中每个title只出现一次,即使Job模型中有重复的职位标题
内容的提问来源于stack exchange,提问作者Manish Karki
相关产品推荐
相关产品推荐

