我需要一些帮助在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))
答案 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}
。然后由您来解决这种情况。