Django ORM获得每个model_used得分前3的工作



Models.py:

class ScoringModel(models.Model):
    title = models.CharField(max_length=64)

class PredictedScore(models.Model):
    job = models.ForeignKey('Job')
    candidate = models.ForeignKey('Candidate')
    model_used = models.ForeignKey('ScoringModel')
    score = models.FloatField()
    created_at = models.DateField(auto_now_add=True)
    modified_at = models.DateTimeField(auto_now=True)

serializers.py:

class MatchingJobsSerializer(serializers.ModelSerializer):
    job_title = serializers.CharField(source='job.title', read_only=True)
    class Meta:
        model = PredictedScore
        fields = ('job', 'job_title', 'score', 'model_used', 'candidate')

为了获取前 3 个作业,我尝试了以下代码:

queryset = PredictedScore.objects.filter(candidate=candidate)
jobs_serializer = MatchingJobsSerializer(queryset, many=True)
jobs = jobs_serializer.data
top_3_jobs = heapq.nlargest(3, jobs, key=lambda item: item['score'])

它为我提供了包含所有模型的整套的前 3 个工作。我想为所使用的每个模型获取给定候选人得分最高的工作。因此,它应该返回给定候选人的每个 ML 模型的前 3 个匹配作业。

我 https://stackoverflow.com/a/2076665/2256258 遵循了这个答案。它为每家面包店提供了最新的蛋糕条目,但我需要前 3 名。 我读过 django ORM 中的注释,但对这个问题知之甚少。我想使用 DRF 序列化程序进行此操作。这是一个只读操作。

我正在使用Postgres作为数据库。

应该用什么 Django ORM 查询来执行此操作?

让数据库完成工作。 您也不需要注释,因为您需要对象,而不是值或操作值。

要获得候选人的所有分数(不除以model_used),您需要执行以下操作:

queryset = candidate.property_set.filter(candidate=candidate).order_by('-score)[:2]
jobs_serializer = MatchingJobsSerializer(queryset, many=True)
jobs = jobs_serializer.data

令人讨厌的是,您的建议不是特别适合 Django ORM - 我认为您可能需要为每个model_used进行单独的查询。 一个更好的解决方案(此示例未经测试)是将 Q 查询挂钩在一起,根据此答案。

例子是有标签,但我认为成立 -

#lets get a distinct list of the models_used - 
all_models_used = PredictedScore.objects.values('models_used').distinct()
q_objects = Q() # Create an empty Q object to start with
for m in all_models_used:
    q_objects |= Q(model_used=m)[:3] # 'or' the Q objects together
queryset = PredictedScore.objects.filter(q_objects) 

最新更新