I have the following models, models.py
class Account(models.Model):
user = models.OneToOneField(User, null=True, on_delete=models.CASCADE)
name = models.CharField(max_length=255, null=True)
profile_pic = models.ImageField(null=True, blank=True)
ratings = models.FloatField(default=1000)
date_joined = models.DateTimeField(auto_now_add=True, null=True)
phone = models.CharField(max_length=255, null=True)
class Match(models.Model):
match_time = models.DateTimeField(null=True)
totalPlayers = models.IntegerField(default=2)
winner = models.ForeignKey(Account, on_delete=models.SET_NULL, null=True)
class Meta:
ordering = ['-match_time']
class Participant(models.Model):
match = models.ForeignKey(Match, on_delete=models.CASCADE)
player = models.ForeignKey(Account, on_delete=models.CASCADE)
player_points = models.FloatField(null=True)
What I want is basically to write a Query that can return me the following things, Player_Name
, Total Matches by Player
, Total Points of Player
, Matches Won by the Player
, Player Ratings
I wrote a query like this and it worked great for all the columns above, except Total Points of Player
and Matches Won by the Player
players = Account.objects.annotate(matches=Count('participant')).order_by('-ratings')
So, following the same principle, I tried the following Query to get what I needed exactly,
players = Account.objects.annotate(matches=Count('participant'), total_points=Count('player_points'), matches_won=Count('winner')).order_by('-ratings')
But this is giving me the following error,
Cannot resolve keyword 'player_points' into field. Choices are: date_joined, id, match, matches, name, participant, phone, profile_pic, ratings, user, user_id
I unfortunately do not understand how I can get my required result. Can anyone help me reach what I am trying to do?
CodePudding user response:
The issue is that player_points
are not in the account model, it is in the participant.
players = Account.objects.annotate(matches=Count('participant'), total_points=Count('player_points'), matches_won=Count('winner')).order_by('-ratings')
For the Total Points of Player
use this in the annotate.
total_points=Sum('participant__player_points') # By the description i think you are looking the Sum of the point as a total not the Count, but you can change it if not.
For the Matches Won by the Player
:
mathces_won=Count('match')