首页 > 解决方案 > 根据给定字段将 Django 查询集拆分为多个子列表

问题描述

我有以下模型:

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对象相关联:GameUser

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(queryset of Membership) 拆分为子列表以收集所有Membership相同的匹配Game

理想情况下,我会在视图中而不是在模板中执行此操作。

标签: djangodjango-views

解决方案


也许你可以换个角度想。

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

推荐阅读