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

时间:2017-11-02 09:51:42

标签: python django postgresql django-rest-framework

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个工作。 我想为每个使用的模型的特定候选人获取前3个分数的工作。 因此,它应该返回给定候选人的每个ML模型的前3个匹配作业。

我按照这个回答https://stackoverflow.com/a/2076665/2256258。它为每个面包店提供最新的蛋糕,但我需要前三名。  我在django ORM中读到了关于注释的内容,但是对于这个问题并没有太多了解。我想使用DRF序列化程序进行此操作。这是一个只读操作。

我使用Postgres作为数据库。

执行此操作的Django ORM查询应该是什么?

1 个答案:

答案 0 :(得分:1)

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

要获得候选人的所有分数(不是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分别进行查询。一个更好的解决方案(本例未经测试)是根据this answer将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)