пытается отобразить шаблон Sum on каждого экземпляра поля класса, отфильтрованного другим полем того же класса. python django фэнтези-спорт - PullRequest
0 голосов
/ 09 июля 2020

[снимок экрана со страницей списка фэнтези-команды]

Я пытаюсь создать сайт фэнтези-спорта. У меня есть игроки НБА (как класс), назначенные (django встроенным) пользователям (команда фэнтези) через поле в классе игрока. Я хочу суммировать все зарплаты игроков пользователя за данный год и перечислить это на странице списка игроков этого пользователя (также известного как команда) (независимо от того, кто вошел в систему.) Я смог получить эту сумму на оболочке django для указанного c user_id:

импортированный класс Player в оболочку & django .db.models import Sum Player.objects.filter (player_owner__exact = '1'). aggregate (Sum ('player_sal_19_20') )

результат: {'player_sal_19_20__sum': Decimal ('89654339')}

Но как я могу получить эту сумму в шаблоне для страницы списка publi c команды fantasy ?

Я целыми днями пробовал агрегатную функцию, пытаясь объединить ее с моей функцией get_queryset (см. Фрагмент представлений), тегами шаблонов и некоторыми другими методами, которые мне не по зубам.

Я использую встроенных пользователей django в качестве своих команд и создал класс игрока на models.py:

class Player(models.Model):
  player_full = models.CharField(max_length=50)
  player_sal_19_20 = models.DecimalField(default=0, max_digits=10, decimal_places=2)
  player_sal_20_21 = models.DecimalField(default=0, max_digits=10, decimal_places=2)
  player_sal_21_22 = models.DecimalField(default=0, max_digits=10, decimal_places=2)
  player_sal_22_23 = models.DecimalField(default=0, max_digits=10, decimal_places=2)
  player_owner = models.ForeignKey(User, default='26', on_delete=models.CASCADE)

Затем я создал представление для страницы игроков пользователя на представлениях .py:

class UserPlayerListView(ListView):
  model = Player
  template_name = 'blog/user_players.html'
  context_object_name = 'players'
  paginate_by = 20

  def get_queryset(self):
      user = get_object_or_404(User, username=self.kwargs.get('username'))
      return Player.objects.filter(player_owner=user).order_by('-date_posted')

Наконец-то я смог o наметить простые вещи в шаблоне html с помощью циклов. Но, увы, я нахожусь в затруднительном положении, когда доходит до запроса годовой зарплаты группы игроков, отфильтрованной по назначенному им фантазийному пользователю. поле для каждого игрока, которое появляется в списке команды, которое определяется полем игрока 'fantasy_owner'.

Я новичок в django и python. Я полагаю, что это на самом деле легко сделать, поэтому заранее прошу прощения, если это так. Кроме того, если кто-нибудь знает примеры использования python / django для сайта о фэнтези-спорте, это тоже будет полезно!

Ответы [ 2 ]

0 голосов
/ 09 июля 2020

@ ruddra total прибил его, спасибо!

Я еще немного повозился с этим и смог просто добавить больше контекстных диктов (?) Под def, чтобы получить общую сумму зарплаты за каждый год:

    def get_context_data(self, **kwargs):
      context = super().get_context_data(**kwargs)
      context['sum_of_sal_19_20'] = context['players'].aggregate(players_sum=Sum('player_sal_19_20'))['players_sum']
      context['sum_of_sal_20_21'] = context['players'].aggregate(players_sum=Sum('player_sal_20_21'))['players_sum']
      context['sum_of_sal_21_22'] = context['players'].aggregate(players_sum=Sum('player_sal_21_22'))['players_sum']
      context['sum_of_sal_22_23'] = context['players'].aggregate(players_sum=Sum('player_sal_22_23'))['players_sum']
      return context

, тогда я смог просто использовать 'sum_of_sal_19_20' в шаблоне как {{sum_of_sal_19_20}}

Затем я попытаюсь выяснить, как использовать эти числа для определения потолка заработной платы, расчета потолка штрафы и все такое забавное. Также собираюсь попытаться заняться торговлей игроками между пользователями. Еще раз спасибо!

0 голосов
/ 09 июля 2020

Вы можете попробовать это, переопределив метод get_context_data(...):

class UserPlayerListView(ListView):
  # rest of the code
  def get_context_data(self, **kwargs):
      context = super().get_context(**kwargs)
      context['sum_of_salary'] = context['players'].aggregate(players_sum=Sum('player_sal_19_20'))['players_sum']
      return context

Затем используйте его в шаблоне:

{{ sum_of_salary }}

update

( Из комментариев ), поскольку у вас есть несколько атрибутов, которые вы хотите агрегировать, попробуйте следующее:

class UserPlayerListView(ListView):
      # rest of the code
      def get_context_data(self, **kwargs):
          context = super().get_context(**kwargs)
          context['sum_sal_19_20'] = context['players'].aggregate(players_sum=Sum('player_sal_19_20'))['players_sum']
          context['sum_sal_20_21'] = context['players'].aggregate(players_sum=Sum('player_sal_20_21'))['players_sum']
          # and so on
          return context

Затем используйте его в шаблоне:

{{ sum_sal_19_20 }}
{{ sum_sal_20_21 }}
// and so on

Но в этом решении , он будет обращаться к базе данных несколько раз, когда вы вызываете aggregate(). Поэтому я бы порекомендовал вам оценить набор запросов, чтобы вывести и вычислить sum способом pythoni c. Например:

class UserPlayerListView(ListView):
    def get_context_data(self, **kwargs):
        context = super().get_context(**kwargs)
        player_list = list(context['players'])  # evaluates the query
        context['sum_sal_19_20'] = sum([x.player_sal_19_20 for x in player_list])  # pythonic sum calculation
        context['sum_sal_20_21'] = sum([x.player_sal_20_21 for x in player_list])
        # and so on
        context['players'] = player_list          
        return context

Более элегантное решение

Вы можете просто использовать группировку по полученному значению:

def get_context_data(self, **kwargs):
    context = super().get_context(**kwargs)
    players_salary_values = list(
        context['players'].values('player_owner').annotate(
            salary_19_20=Sum('player_sal_19_20'),
            salary_20_21=Sum('player_sal_20_21')
        ).values(
            'salary_19_20', 
            'salary_20_21'
        )
    )[0]
    # as there is only one player owner here, you can use 1st index of the list
    context.update(players_salary_values)
    return context
...