Django在过滤后的模型实例组中获取最大字段值

时间:2018-06-20 20:38:27

标签: django

我需要一些帮助在View中创建自定义Django查询。我有两个模型,部门和团队,每个部门可以有多个团队。用户可以按任何顺序手动对团队进行排序,完成后,订单字段将在每个团队实例上更新。因此,现在创建新团队时,我想在特定部门内获得最大的Team.order值。

下面的这一部分将返回所有团队实例Team.objects.filter(department=team.department.id),但是如何从订单字段(而不是循环)中获取最大值?

查看

class TeamCreate(LoginRequiredMixin, CreateView):
    model = Team
    form_class = TeamForm
    template_name = 'app/sidebar_team.html'

    # def get_initial(self):
    def get_initial(self):
        pk = self.request.GET.get('id')
        return {
            'department': pk,
        }

    def post(self, request, *args, **kwargs):
        form = TeamForm(request.POST)
        if form.is_valid():
            team = form.save(commit=False)
            team.author = request.user
            team.modified_date = timezone.now()

            # Get max Team.order value, increment by one, and set as new team.order
            max = Team.objects.filter(department=team.department.id).extra(Max('order'))

            team.save()
            return redirect('/dashboard/' + str(team.department.id))

        else:
            return redirect('/dashboard/' + str(form.department.id))

1 个答案:

答案 0 :(得分:1)

如果要将整个项目集合“ 折叠”成一个或多个值,则称为.aggregate(..) [django-doc]。因此,我们可以编写类似以下内容的聚合:

Team.objects.filter(
    department=team.department.id
).aggregate(
    max_order=Max('order')
)['max_order']

.aggregate(..)将执行查询,并返回包含聚合结果的字典。由于此处仅执行一个聚合(名称为max_order),因此字典中包含该元素。因此,我们可以使用['max_order']来获取它。

请注意,如果没有与过滤器匹配的行(或者根本没有Team),这将返回一个字典,其中为< em> value None 。因此,您将需要解决此问题。因此,例如,如果根本没有Team,则Team.objects.filter(..).agregate(..)将返回{'max_order': None}。然后由您来解决这种情况。