我想使用SerializerMethodFields
,f.e.按提交或有效性对模型进行排序
#models.py
class Vendor(CreateModificationDateMixin):
user = models.OneToOneField(User_Profile, on_delete=models.CASCADE, primary_key=True)
job_title = models.CharField(max_length=100, default=None)
phone_regex = RegexValidator(regex=r'^\+?1?\d{9,15}$',
message="Phone number must be entered in the format: '+999999999'. Up to 15 digits allowed.")
is_prefered = models.BooleanField(default=False, editable=False, blank=True)
number_of_employees = models.CharField(max_length=255, blank=True)
company_regex = RegexValidator(regex=r'^\+?1?\d{9,15}$',
message="company number must be entered in the format: '+999999999'. Up to 15 digits allowed.")
company_phone_number = models.CharField(validators=[company_regex], max_length=17, blank=True, null=True)
fax_regex = RegexValidator(regex=r'^\+?1?\d{9,15}$',
message="fax number must be entered in the format: '+999999999'. Up to 15 digits allowed.")
fax_number = models.CharField(validators=[fax_regex], max_length=17, blank=True, null=True)
def __str__(self):
return self.user.username
class Meta:
verbose_name_plural = "vendors"
db_table = 'vendor'
#serializers
class AllVendors(DjongoModelSerializer):
user = UserProfileSerilaizer(required=True)
is_prefered = SerializerMethodField()
submissions = SerializerMethodField(read_only=True)
effectiveness = SerializerMethodField(read_only=True)
hotlist_count = SerializerMethodField(read_only=True)
lastupdated_at = SerializerMethodField(read_only=True)
class Meta:
model = Vendor
fields = '__all__'
depth = 1
def get_lastupdated_at(self,obj):
candidate = list(CandidateList.objects.filter(vendor_id=obj.user_id).order_by('-modification').values_list('modification',flat=True))
if candidate:
return candidate[0]
else:
return ''
def get_hotlist_count(self,instance):
return CandidateList.objects.filter(vendor_id=instance.user.id).filter(candidate_status='Candidate Available').count()
def get_is_prefered(self, obj):
try:
client_id = self.context['request'].user.id
is_prefered = PreferredVendors.objects.filter(user_id=client_id).filter(vendor_id=obj.user.id).values('is_prefered')
if len(is_prefered)>0:
return is_prefered
else:
return [{'is_prefered':False}]
except:
return [{'is_prefered':False}]
def get_submissions(self,obj):
return SubmittedCandidate.objects.filter(vendor=obj.user.id).count()
def get_effectiveness(self,obj):
confirm_candidates = SubmittedCandidate.objects.filter(vendor=obj.user.id).filter(interview_status='Selected Final').count()
total_submissions = SubmittedCandidate.objects.filter(vendor=obj.user.id).count()
onboarding = SubmittedCandidate.objects.filter(vendor=obj.user.id).filter(interview_status='OnBoarding').count()
starts = SubmittedCandidate.objects.filter(vendor=obj.user.id).filter(Q(interview_status='Contract')|Q(interview_status='Contract-To-Hire')|Q(interview_status='FullTime/Permanent')).count()
try:
effectiveness = (float(confirm_candidates)+float(starts)+float(onboarding))/float(total_submissions)*100
value = round(effectiveness,2)
formatNumber = lambda n: n if n%1 else int(n)
result = formatNumber(value)
return str(result)+'%'
except ZeroDivisionError:
return str(0)+'%'
#views.py
class AllVendorsViewSet(ModelViewSet):
permission_classes = (IsAuthenticated,)
serializer_class = AllVendors
pagination_class=CustomPagination
def get_queryset(self):
queryset = Vendor.objects.all()
return queryset
目前没有回答
相关问题 更多 >
编程相关推荐