Currently, I am processing a lot of information in views.py, which feels like the incorrect place to do it. Is there a better/place way to process this information? It works, but it doesn’t seem like I am using Django to its potential.
views.py – Where I am doing all the information processing
<code>def stats(request):
user = request.user
deck_list = Deck.objects.filter(user=request.user).annotate(
win_count=Count('game', filter=Q(game__outcome='Win', game__user=request.user)),
loss_count=Count('game', filter=Q(game__outcome='Loss', game__user=request.user)),
draw_count=Count('game', filter=Q(game__outcome='Draw', game__user=request.user)),
incomplete_count=Count('game', filter=Q(game__outcome='Incomplete', game__user=request.user)),
count_1_7=Count('game', filter=Q(game__mull='1st 7', game__user=request.user)),
count_2_7=Count('game', filter=Q(game__mull='2nd 7', game__user=request.user)),
count_6=Count('game', filter=Q(game__mull='6', game__user=request.user)),
count_5=Count('game', filter=Q(game__mull='5', game__user=request.user)),
count_4=Count('game', filter=Q(game__mull='4', game__user=request.user)),
count_3=Count('game', filter=Q(game__mull='3', game__user=request.user)),
count_2=Count('game', filter=Q(game__mull='2', game__user=request.user)),
count_1=Count('game', filter=Q(game__mull='1', game__user=request.user)),
)
# Totals for player
total_game = Game.objects.filter(user=request.user).count()
total_win = Game.objects.filter(user=request.user, outcome='Win').count()
total_loss = Game.objects.filter(user=request.user, outcome='Loss').count()
total_draw = Game.objects.filter(user=request.user, outcome='Draw').count()
total_incomplete = Game.objects.filter(user=request.user, outcome='Incomplete').count()
average_hand_size1_7 = Game.objects.filter(user=request.user, mull='1st 7').count()
average_hand_size2_7 = Game.objects.filter(user=request.user, mull='2nd 7').count()
average_hand_size6 = Game.objects.filter(user=request.user, mull='6').count()
average_hand_size5 = Game.objects.filter(user=request.user, mull='5').count()
average_hand_size4 = Game.objects.filter(user=request.user, mull='4').count()
average_hand_size3 = Game.objects.filter(user=request.user, mull='3').count()
average_hand_size2 = Game.objects.filter(user=request.user, mull='2').count()
average_hand_size1 = Game.objects.filter(user=request.user, mull='1').count()
average_hand = 0
if total_game == 0:
pass
else:
average_hand = (average_hand_size1_7 * 7 + average_hand_size2_7 * 7 + average_hand_size6 * 6 +
average_hand_size5 * 5 + average_hand_size4 * 4 + average_hand_size3 * 3 +
average_hand_size2 * 2 + average_hand_size1) / total_game
context = {
'user': user,
'deck_list': deck_list,
'total_game': total_game,
'total_win': total_win,
'total_loss': total_loss,
'total_draw': total_draw,
'total_incomplete': total_incomplete,
'average_hand': average_hand,
}
return render(request, 'gametracker_app/stats.html', context=context)
</code>
<code>def stats(request):
user = request.user
deck_list = Deck.objects.filter(user=request.user).annotate(
win_count=Count('game', filter=Q(game__outcome='Win', game__user=request.user)),
loss_count=Count('game', filter=Q(game__outcome='Loss', game__user=request.user)),
draw_count=Count('game', filter=Q(game__outcome='Draw', game__user=request.user)),
incomplete_count=Count('game', filter=Q(game__outcome='Incomplete', game__user=request.user)),
count_1_7=Count('game', filter=Q(game__mull='1st 7', game__user=request.user)),
count_2_7=Count('game', filter=Q(game__mull='2nd 7', game__user=request.user)),
count_6=Count('game', filter=Q(game__mull='6', game__user=request.user)),
count_5=Count('game', filter=Q(game__mull='5', game__user=request.user)),
count_4=Count('game', filter=Q(game__mull='4', game__user=request.user)),
count_3=Count('game', filter=Q(game__mull='3', game__user=request.user)),
count_2=Count('game', filter=Q(game__mull='2', game__user=request.user)),
count_1=Count('game', filter=Q(game__mull='1', game__user=request.user)),
)
# Totals for player
total_game = Game.objects.filter(user=request.user).count()
total_win = Game.objects.filter(user=request.user, outcome='Win').count()
total_loss = Game.objects.filter(user=request.user, outcome='Loss').count()
total_draw = Game.objects.filter(user=request.user, outcome='Draw').count()
total_incomplete = Game.objects.filter(user=request.user, outcome='Incomplete').count()
average_hand_size1_7 = Game.objects.filter(user=request.user, mull='1st 7').count()
average_hand_size2_7 = Game.objects.filter(user=request.user, mull='2nd 7').count()
average_hand_size6 = Game.objects.filter(user=request.user, mull='6').count()
average_hand_size5 = Game.objects.filter(user=request.user, mull='5').count()
average_hand_size4 = Game.objects.filter(user=request.user, mull='4').count()
average_hand_size3 = Game.objects.filter(user=request.user, mull='3').count()
average_hand_size2 = Game.objects.filter(user=request.user, mull='2').count()
average_hand_size1 = Game.objects.filter(user=request.user, mull='1').count()
average_hand = 0
if total_game == 0:
pass
else:
average_hand = (average_hand_size1_7 * 7 + average_hand_size2_7 * 7 + average_hand_size6 * 6 +
average_hand_size5 * 5 + average_hand_size4 * 4 + average_hand_size3 * 3 +
average_hand_size2 * 2 + average_hand_size1) / total_game
context = {
'user': user,
'deck_list': deck_list,
'total_game': total_game,
'total_win': total_win,
'total_loss': total_loss,
'total_draw': total_draw,
'total_incomplete': total_incomplete,
'average_hand': average_hand,
}
return render(request, 'gametracker_app/stats.html', context=context)
</code>
def stats(request):
user = request.user
deck_list = Deck.objects.filter(user=request.user).annotate(
win_count=Count('game', filter=Q(game__outcome='Win', game__user=request.user)),
loss_count=Count('game', filter=Q(game__outcome='Loss', game__user=request.user)),
draw_count=Count('game', filter=Q(game__outcome='Draw', game__user=request.user)),
incomplete_count=Count('game', filter=Q(game__outcome='Incomplete', game__user=request.user)),
count_1_7=Count('game', filter=Q(game__mull='1st 7', game__user=request.user)),
count_2_7=Count('game', filter=Q(game__mull='2nd 7', game__user=request.user)),
count_6=Count('game', filter=Q(game__mull='6', game__user=request.user)),
count_5=Count('game', filter=Q(game__mull='5', game__user=request.user)),
count_4=Count('game', filter=Q(game__mull='4', game__user=request.user)),
count_3=Count('game', filter=Q(game__mull='3', game__user=request.user)),
count_2=Count('game', filter=Q(game__mull='2', game__user=request.user)),
count_1=Count('game', filter=Q(game__mull='1', game__user=request.user)),
)
# Totals for player
total_game = Game.objects.filter(user=request.user).count()
total_win = Game.objects.filter(user=request.user, outcome='Win').count()
total_loss = Game.objects.filter(user=request.user, outcome='Loss').count()
total_draw = Game.objects.filter(user=request.user, outcome='Draw').count()
total_incomplete = Game.objects.filter(user=request.user, outcome='Incomplete').count()
average_hand_size1_7 = Game.objects.filter(user=request.user, mull='1st 7').count()
average_hand_size2_7 = Game.objects.filter(user=request.user, mull='2nd 7').count()
average_hand_size6 = Game.objects.filter(user=request.user, mull='6').count()
average_hand_size5 = Game.objects.filter(user=request.user, mull='5').count()
average_hand_size4 = Game.objects.filter(user=request.user, mull='4').count()
average_hand_size3 = Game.objects.filter(user=request.user, mull='3').count()
average_hand_size2 = Game.objects.filter(user=request.user, mull='2').count()
average_hand_size1 = Game.objects.filter(user=request.user, mull='1').count()
average_hand = 0
if total_game == 0:
pass
else:
average_hand = (average_hand_size1_7 * 7 + average_hand_size2_7 * 7 + average_hand_size6 * 6 +
average_hand_size5 * 5 + average_hand_size4 * 4 + average_hand_size3 * 3 +
average_hand_size2 * 2 + average_hand_size1) / total_game
context = {
'user': user,
'deck_list': deck_list,
'total_game': total_game,
'total_win': total_win,
'total_loss': total_loss,
'total_draw': total_draw,
'total_incomplete': total_incomplete,
'average_hand': average_hand,
}
return render(request, 'gametracker_app/stats.html', context=context)
models.py
<code>class Profile(models.Model):
user = models.ForeignKey(User,
max_length=100,
on_delete=models.CASCADE,
null=True)
def __str__(self):
return str(self.user)
class TrackPref(models.Model):
track_cedh = models.BooleanField(default=True)
track_wincon = models.BooleanField(default=True)
track_tournament = models.BooleanField(default=True)
track_medium = models.BooleanField(default=True)
track_note = models.BooleanField(default=True)
user = models.OneToOneField(User,
max_length=100,
on_delete=models.CASCADE,
null=True)
def __str__(self):
return str(self.user)
class Deck(models.Model):
deck = models.CharField(max_length=150)
is_cedh = models.BooleanField(default=False)
user = models.ForeignKey(User,
max_length=100,
on_delete=models.CASCADE,
null=True)
def __str__(self):
return self.deck
class Wincon(models.Model):
wincon = models.CharField(max_length=256,
null=True,
blank=True, )
user = models.ForeignKey(User,
max_length=100,
on_delete=models.CASCADE,
null=True, )
def __str__(self):
return self.wincon
class Tournament(models.Model):
tournament = models.CharField(max_length=256,
null=True,
blank=True, )
user = models.ForeignKey(User,
max_length=100,
on_delete=models.CASCADE,
null=True, )
def __str__(self):
return self.tournament
class Game(models.Model):
NUM_PLAYERS_CHOICE = [
(2, 2),
(3, 3),
(4, 4),
(5, 5),
(6, 6)
]
START_POS_CHOICE = [
('1st', '1st'),
('2nd', '2nd'),
('3rd', '3rd'),
('4th', '4th'),
('5th', '5th'),
('6th', '6th')
]
MULL_CHOICE = [
('1st 7', '1st 7'),
('2nd 7', '2nd 7'),
('6', '6'),
('5', '5'),
('4', '4'),
('3', '3'),
('2', '2'),
('1', '1')
]
OUTCOME_CHOICE = [
('Win', 'Win'),
('Loss', 'Loss'),
('Draw', 'Draw'),
('Incomplete', 'Incomplete'),
]
MEDIUM_CHOICE = [
('Online', 'Online'),
('Paper', 'Paper')
]
# ForeignKeys
user = models.ForeignKey(User,
max_length=100,
on_delete=models.CASCADE,
null=True)
deck = models.ForeignKey(Deck, on_delete=models.CASCADE, null=True)
wincon = models.ForeignKey(Wincon,
on_delete=models.CASCADE,
null=True,
blank=True, )
tournament = models.ForeignKey(Tournament,
on_delete=models.CASCADE,
null=True,
blank=True, )
num_players = models.IntegerField(choices=NUM_PLAYERS_CHOICE, default=4)
start_pos = models.CharField(max_length=20, choices=START_POS_CHOICE, default=1)
mull = models.CharField(max_length=20, choices=MULL_CHOICE, default='1st 7')
outcome = models.CharField(max_length=10, choices=OUTCOME_CHOICE, default='Win')
medium = models.CharField(max_length=10, choices=MEDIUM_CHOICE, default='Paper')
note = models.TextField(max_length=1000, null=True, blank=True)
date = models.DateField(auto_now_add=True)
time = models.TimeField(auto_now_add=True)
</code>
<code>class Profile(models.Model):
user = models.ForeignKey(User,
max_length=100,
on_delete=models.CASCADE,
null=True)
def __str__(self):
return str(self.user)
class TrackPref(models.Model):
track_cedh = models.BooleanField(default=True)
track_wincon = models.BooleanField(default=True)
track_tournament = models.BooleanField(default=True)
track_medium = models.BooleanField(default=True)
track_note = models.BooleanField(default=True)
user = models.OneToOneField(User,
max_length=100,
on_delete=models.CASCADE,
null=True)
def __str__(self):
return str(self.user)
class Deck(models.Model):
deck = models.CharField(max_length=150)
is_cedh = models.BooleanField(default=False)
user = models.ForeignKey(User,
max_length=100,
on_delete=models.CASCADE,
null=True)
def __str__(self):
return self.deck
class Wincon(models.Model):
wincon = models.CharField(max_length=256,
null=True,
blank=True, )
user = models.ForeignKey(User,
max_length=100,
on_delete=models.CASCADE,
null=True, )
def __str__(self):
return self.wincon
class Tournament(models.Model):
tournament = models.CharField(max_length=256,
null=True,
blank=True, )
user = models.ForeignKey(User,
max_length=100,
on_delete=models.CASCADE,
null=True, )
def __str__(self):
return self.tournament
class Game(models.Model):
NUM_PLAYERS_CHOICE = [
(2, 2),
(3, 3),
(4, 4),
(5, 5),
(6, 6)
]
START_POS_CHOICE = [
('1st', '1st'),
('2nd', '2nd'),
('3rd', '3rd'),
('4th', '4th'),
('5th', '5th'),
('6th', '6th')
]
MULL_CHOICE = [
('1st 7', '1st 7'),
('2nd 7', '2nd 7'),
('6', '6'),
('5', '5'),
('4', '4'),
('3', '3'),
('2', '2'),
('1', '1')
]
OUTCOME_CHOICE = [
('Win', 'Win'),
('Loss', 'Loss'),
('Draw', 'Draw'),
('Incomplete', 'Incomplete'),
]
MEDIUM_CHOICE = [
('Online', 'Online'),
('Paper', 'Paper')
]
# ForeignKeys
user = models.ForeignKey(User,
max_length=100,
on_delete=models.CASCADE,
null=True)
deck = models.ForeignKey(Deck, on_delete=models.CASCADE, null=True)
wincon = models.ForeignKey(Wincon,
on_delete=models.CASCADE,
null=True,
blank=True, )
tournament = models.ForeignKey(Tournament,
on_delete=models.CASCADE,
null=True,
blank=True, )
num_players = models.IntegerField(choices=NUM_PLAYERS_CHOICE, default=4)
start_pos = models.CharField(max_length=20, choices=START_POS_CHOICE, default=1)
mull = models.CharField(max_length=20, choices=MULL_CHOICE, default='1st 7')
outcome = models.CharField(max_length=10, choices=OUTCOME_CHOICE, default='Win')
medium = models.CharField(max_length=10, choices=MEDIUM_CHOICE, default='Paper')
note = models.TextField(max_length=1000, null=True, blank=True)
date = models.DateField(auto_now_add=True)
time = models.TimeField(auto_now_add=True)
</code>
class Profile(models.Model):
user = models.ForeignKey(User,
max_length=100,
on_delete=models.CASCADE,
null=True)
def __str__(self):
return str(self.user)
class TrackPref(models.Model):
track_cedh = models.BooleanField(default=True)
track_wincon = models.BooleanField(default=True)
track_tournament = models.BooleanField(default=True)
track_medium = models.BooleanField(default=True)
track_note = models.BooleanField(default=True)
user = models.OneToOneField(User,
max_length=100,
on_delete=models.CASCADE,
null=True)
def __str__(self):
return str(self.user)
class Deck(models.Model):
deck = models.CharField(max_length=150)
is_cedh = models.BooleanField(default=False)
user = models.ForeignKey(User,
max_length=100,
on_delete=models.CASCADE,
null=True)
def __str__(self):
return self.deck
class Wincon(models.Model):
wincon = models.CharField(max_length=256,
null=True,
blank=True, )
user = models.ForeignKey(User,
max_length=100,
on_delete=models.CASCADE,
null=True, )
def __str__(self):
return self.wincon
class Tournament(models.Model):
tournament = models.CharField(max_length=256,
null=True,
blank=True, )
user = models.ForeignKey(User,
max_length=100,
on_delete=models.CASCADE,
null=True, )
def __str__(self):
return self.tournament
class Game(models.Model):
NUM_PLAYERS_CHOICE = [
(2, 2),
(3, 3),
(4, 4),
(5, 5),
(6, 6)
]
START_POS_CHOICE = [
('1st', '1st'),
('2nd', '2nd'),
('3rd', '3rd'),
('4th', '4th'),
('5th', '5th'),
('6th', '6th')
]
MULL_CHOICE = [
('1st 7', '1st 7'),
('2nd 7', '2nd 7'),
('6', '6'),
('5', '5'),
('4', '4'),
('3', '3'),
('2', '2'),
('1', '1')
]
OUTCOME_CHOICE = [
('Win', 'Win'),
('Loss', 'Loss'),
('Draw', 'Draw'),
('Incomplete', 'Incomplete'),
]
MEDIUM_CHOICE = [
('Online', 'Online'),
('Paper', 'Paper')
]
# ForeignKeys
user = models.ForeignKey(User,
max_length=100,
on_delete=models.CASCADE,
null=True)
deck = models.ForeignKey(Deck, on_delete=models.CASCADE, null=True)
wincon = models.ForeignKey(Wincon,
on_delete=models.CASCADE,
null=True,
blank=True, )
tournament = models.ForeignKey(Tournament,
on_delete=models.CASCADE,
null=True,
blank=True, )
num_players = models.IntegerField(choices=NUM_PLAYERS_CHOICE, default=4)
start_pos = models.CharField(max_length=20, choices=START_POS_CHOICE, default=1)
mull = models.CharField(max_length=20, choices=MULL_CHOICE, default='1st 7')
outcome = models.CharField(max_length=10, choices=OUTCOME_CHOICE, default='Win')
medium = models.CharField(max_length=10, choices=MEDIUM_CHOICE, default='Paper')
note = models.TextField(max_length=1000, null=True, blank=True)
date = models.DateField(auto_now_add=True)
time = models.TimeField(auto_now_add=True)