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查询应该是什么?
答案 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)