我正在使用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()中有多个对象。