Разделить набор запросов Django на множество подсписков на основе заданного поля - PullRequest
0 голосов
/ 22 мая 2018

У меня есть следующая модель:

class Game(models.Model):
    users = models.ManyToManyField(User, through='Membership', related_name='users')
    date_game = models.DateField(default=datetime.date.today)


class Membership(models.Model):

    user = models.ForeignKey(User,  on_delete=models.CASCADE, verbose_name=_('joueur'))
    game = models.ForeignKey(Game, on_delete=models.CASCADE)
    score = models.IntegerField(_('score'), default=0, validators=[
            MaxValueValidator(50),
            MinValueValidator(0)
        ])

У меня также есть этот ListView, который предназначен для извлечения всего объекта Membership, связанного с Game, сыгранным данным User:

class GameListView(ListView):
    model = webapp_models.Membership
    template_name = 'list_games.html'
    form = webapp_forms.UserChoiceField

    def get_queryset(self):

        if self.request.method == 'GET':

            form = self.form(self.request.GET)

            if form.is_valid():
                user = form.cleaned_data['user_choice_field']

                # all games played by the user
                tmp = Game.objects.filter(membership__user=user)

                # all memberships associated to games played by the user
                out = Membership.objects.filter(game__in=tmp)

                for obj in out:
                    print(obj.game.date_game, obj.game.id, obj.user.username, obj.score)

                return out

            return Membership.objects.all()

    def get_context_data(self, *args, object_list=None, **kwargs):
        context = super(GameListView, self).get_context_data(*args, object_list=None, **kwargs)
        # use the GET data to avoid resetting the form
        context['form'] = self.form(self.request.GET)
        return context

Поэтому я хотел бы разбить out (набор запросов Membership) на подсписки, чтобы собрать все Membership, совпадающие с Game.

В идеале, ябудет делать это в представлении, а не в шаблоне.

Ответы [ 2 ]

0 голосов
/ 23 мая 2018

Мне удалось собрать Membership объектов, связанных с тем же Game с помощью тега regroup в шаблоне:

{% regroup membership_list by game.id as memberships %}
<ul>
{% for group in memberships %}
    <li>{{ group.grouper }}
    <ul>
         {% for m in group.list %}
          <li>{{ m.user.username }}: {{ m.score }}</li>
        {% endfor %}

    </ul>
    </li>
{% endfor %}
</ul>
0 голосов
/ 22 мая 2018

Может быть, вы можете думать об этом немного по-другому.

games = Game.objects.filter(membership__user=user).select_related('membership')

for game in games:
     for member in game.members:
          ...do whatever with the members/scores
...