在django queryset上注释后重复的resuts

时间:2017-10-10 08:04:11

标签: python django django-rest-framework django-queryset

我正在使用Django 1.10和Django REST框架,需要在这样的关系上创建一个过滤器

class Player(models.Model):
    name = models.CharField(max_length=20, null=True, blank=True)

class Score(models.Model):
    player = models.OneToOneField('companies.Company')

class ScorePeriod(models.Model):
    score = models.ForeignKey('Score', on_delete=models.CASCADE)
    period = models.DateField()
    period_score = models.PositiveIntegerField()

播放器过滤器应按最后一个period_score过滤,但仅限于最后一个句点在给定年份之前。如果年份是2015年且2016年和2015年有ScorePeriod,则应按2015年期间的比例进行筛选。如果有2014年和2013年的ScorePeriod,那么给定的年份是2015年应该在2014年之前过滤。

在视图中我正在使用注释,因此我可以通过过滤器文件中的last_score进行过滤。这是观点。

queryset = super().get_queryset()
max_year = get_starting_year()

queryset = queryset.annotate(
    last_score_year_available=Max(Case(
        When(score__scoreperiod__period__year__lte=max_year,
             then=F('score__scoreperiod__period')),
        output_field=DateField()
    )),
)

queryset = queryset.annotate(
    last_score=Case(
        When(score__scoreperiod__period=F('last_score_year_available'),
             then=F('score__scoreperiod__period_score')),
        default=None,
        output_field=IntegerField(),
    ),
)

return queryset

这可以正常过滤,但会为数据库中的每个ScorePeriod返回一个副本。当获得类似“players / 1”之类的东西时会失败,因为get()中有多个对象。

0 个答案:

没有答案