【问题标题】:Django annotate fails when querying unique values查询唯一值时 Django 注释失败
【发布时间】:2013-02-28 10:05:46
【问题描述】:

对于 Django 项目,我需要将两个部件列表合二为一。

models.py

class UserBuild(models.Model):
    project = models.ForeignKey(Project)
    created = models.DateTimeField(auto_now_add=True)
    updated = models.DateTimeField(auto_now=True)
    part = models.ForeignKey(Parts)
    part_quantity = models.IntegerField(max_length=5, null=True, blank=True)
    suggested_quantity = models.IntegerField(
        max_length=5, null=True, blank=True
    )

views.py

def CombineProjects(request, template_name='combined_projects.html'):
    ...
    build_set = UserBuild.objects.values(
        #'pk',
        #'project__pk',
        'part__number',
        'part__part_type__name',
        'part__price',
        'part__description',
        'part__category__name'
    ).filter(
        project__in=projects
    ).order_by('part__category', 'part__part_type').annotate(total=Sum('part_quantity'))

基本上在这里,我想对所有相同的部分进行分组并将它们的数量相加。如上所述,但如果我取消注释 pkproject__pk 参数,则不再对这些部分进行分组(我假设是因为即使部分相同,它们也是可变的)。

有没有什么方法可以让我保持分组但也包括 pkproject__pk 值?

【问题讨论】:

  • 在 pk 上分组没有意义......它在这种情况下是独一无二的,所以没有什么可以总结或分组的。你到底想数什么?
  • 我想将相同数量的零件数量相加,但我还需要其他值可用。我实际上不需要pk,但我确实需要project__pk。在我取消注释 project__pk 之前,一切都按我的意愿运行。

标签: django django-models django-views django-queryset


【解决方案1】:

问题在于您的值列表是您分组和汇总的内容;所以你真的只想按项目和零件号分组。

我会尝试:

build_set = UserBuild.objects.values(
    'project__pk',
    'part__number',
).filter(
    project__in=projects
).order_by('part__category', 'part__part_type').annotate(total=Sum('part_quantity'))

然后稍后将其他属性合并到此列表中。但是,我不确定这是否可行。您可能需要这样做:

build_set = UserBuild.objects.values(
    'project_id',
    'part_id',
).filter(
    project__in=projects
).order_by('part__category', 'part__part_type').annotate(total=Sum('part_quantity'))

然后再做更多的手工工作。

【讨论】:

  • 实际上,我最终在没有 pk 值的情况下进行了第一个查询。后来我可以使用projects 列表来获取我的项目实例。绝对教会了我一点 annotate 的工作原理。
猜你喜欢
  • 1970-01-01
  • 2017-04-14
  • 1970-01-01
  • 1970-01-01
  • 2017-04-07
  • 1970-01-01
  • 2017-07-09
  • 2020-01-18
  • 1970-01-01
相关资源
最近更新 更多