Django多表注释

2024-04-27 14:26:46 发布

您现在位置:Python中文网/ 问答频道 /正文

鉴于模型:

class Member(models.Model):
  first_name = models.CharField(max_length=200)
  last_name = models.CharField(max_length=200)

class MemberAction(models.Model):
  member = models.ForeignKey(Member, on_delete=models.CASCADE)
  action = models.CharField(max_length=200)
  datetime = models.DateTimeField()
  points = models.IntegerField()

class MemberMention(models.Model):
  member = models.ForeignKey(Member, on_delete=models.CASCADE)
  date = models.DateTimeField()
  points = models.IntegerField()

我想在给定的一周内获得MemberAction和MemberAttention积分组合最多的前五名成员。我还希望查询返回给定日期内成员的所有MemberAction行。你知道怎么做吗?你知道吗

我得到了下面的代码,但是为points_action返回的数字不正确。奇怪的是,当我删除annotatepoints_news的调用时,它工作正常。你知道吗

def index(request):
    today = timezone.now()
    week_ago = today - timedelta(7)

    ma_w_dates = MemberAction.objects.filter(datetime__date__gte=week_ago,datetime__date__lte=today)
    mention_pts = Sum('membermention__points', filter=Q(membermention__date__date__gte=week_ago,membermention__date__date__lte=today))
    action_pts = Sum('memberaction__points', filter=Q(memberaction__datetime__date__gte=week_ago,memberaction__datetime__date__lte=today))
    members = Member.objects.annotate(points_actions=action_pts).annotate(points_news=mention_pts).order_by('-points_actions').prefetch_related(Prefetch('memberaction_set', queryset=ma_w_dates))[:5]

    context = {'members':members}
    return render(request, 'data/index__text.html', context)

Tags: todaydatetimedatemodelmodelsactionagopoints