56 lines
2.2 KiB
Python
56 lines
2.2 KiB
Python
from rest_framework import serializers
|
|
from .models import Organization
|
|
|
|
|
|
class OrganizationSerializer(serializers.ModelSerializer):
|
|
job_count = serializers.SerializerMethodField()
|
|
edu_summary = serializers.SerializerMethodField()
|
|
|
|
class Meta:
|
|
model = Organization
|
|
fields = ['id', 'name', 'parent', 'logo', 'description', 'email', 'is_active', 'job_count', 'edu_summary']
|
|
|
|
def get_job_count(self, obj):
|
|
return obj.jobs.filter(status='published').count()
|
|
|
|
def get_edu_summary(self, obj):
|
|
"""每个学历的招聘总人数"""
|
|
from django.db.models import Sum
|
|
jobs = obj.jobs.filter(status='published')
|
|
result = []
|
|
for edu in ['博士', '硕士', '本科及以下']:
|
|
total = jobs.filter(education=edu).aggregate(s=Sum('headcount'))['s'] or 0
|
|
if total > 0:
|
|
result.append({'education': edu, 'count': total})
|
|
return result
|
|
|
|
|
|
class OrganizationTreeSerializer(serializers.ModelSerializer):
|
|
"""带子公司列表,用于门户展示"""
|
|
children = serializers.SerializerMethodField()
|
|
job_count = serializers.SerializerMethodField()
|
|
jobs_by_education = serializers.SerializerMethodField()
|
|
|
|
class Meta:
|
|
model = Organization
|
|
fields = ['id', 'name', 'logo', 'description', 'email', 'job_count', 'children', 'jobs_by_education']
|
|
|
|
def get_job_count(self, obj):
|
|
return obj.jobs.filter(status='published').count()
|
|
|
|
def get_children(self, obj):
|
|
return OrganizationSerializer(
|
|
obj.children.filter(is_active=True), many=True, context=self.context
|
|
).data
|
|
|
|
def get_jobs_by_education(self, obj):
|
|
from apps.jobs.models import Job
|
|
org_ids = [obj.id] + list(obj.children.filter(is_active=True).values_list('id', flat=True))
|
|
jobs = Job.objects.filter(organization_id__in=org_ids, status='published').values('title', 'education', 'headcount')
|
|
result = []
|
|
for edu in ['博士', '硕士', '本科及以下']:
|
|
edu_jobs = [{'title': j['title'], 'headcount': j['headcount']} for j in jobs if j['education'] == edu]
|
|
if edu_jobs:
|
|
result.append({'education': edu, 'jobs': edu_jobs})
|
|
return result
|