如何使用SerializerMethodField对queryset进行排序?

2024-04-20 09:38:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我想使用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