【问题标题】:Querying for GroupBy in Django在 Django 中查询 GroupBy
【发布时间】:2021-11-01 13:15:18
【问题描述】:
class Author(models.Model):
    first_name = models.CharField(max_length=10)
    last_name = models.CharField(max_length=10, null=True, blank=True)
    
    def __str__(self):
        return f'{self.first_name} {self.last_name}'
    

class Book(models.Model):
    name = models.CharField(max_length=100)
    author = models.ManyToManyField(Author, related_name='book_author')
    price = models.SmallIntegerField()
    
    def __str__(self):
        return self.name

你好! 我一直在尝试根据作者对上述模型中的书籍成本进行分组(因为一本书可以有多个作者)。我知道它可以使用 groupby 来完成,但我不知道如何在 Django ORM 中查询它,我尝试搜索网络但没有得到相关的解决方案。

我想做的是, 例如,如果一本书“Wonder”有两个作者“A”和“B”,并且他们也与其他书一起写作, 就像'A'和'B'的'Wonder'和 “A”和“B”的“新”

所以,我想查询书籍的作者组合+作者所写的所有书籍的总成本字段(多对多作者组合)。

如果有办法,请帮忙,对不好的解释表示歉意。

【问题讨论】:

  • 我怀疑在 django 中是否有比这篇文章更好的分组介绍 hakibenita.com/django-group-by-sql
  • 您能否添加一个适当的示例来演示,存在什么以及您期望什么答案,因为您提供的示例很难可视化和理解您的问题?
  • 当然,我想要的是,假设...一本名为 'Wonder' 的书由 'A' 和 'B' 写,另一本名为 'New' 的书由相同的 'A' 和 ' B',所以当我们得到所有书籍时,我希望在每个查询集中有一个名为“totalCost”的属性(它可以是任何东西),这给了我同一作者组合所写书籍价格的总和。
  • 那么您是提供作者组合AB 作为输入还是书籍Wonder 作为输入?
  • 不,我没有提供组合,我使用多对多关系链接了作者 A 和 B。

标签: python django group-by django-queryset django-orm


【解决方案1】:

这包括很少的编码和解决方法。

考虑您要处理的 main_book 实例(假设它的书 Wonder )。 之后, 获取该书的所有作者,如下所示

authors = set(main_book.author.all())

稍后像这样过滤掉所有包含这些authors的书籍,

books = Book.objects.filter(author__in=authors)

接下来就是确切的逻辑了,

total_cost = 0
for book in books:
    if authors == set(book.author.all()):
        total_cost += book.price
print(total_cost)

这应该返回所有具有相同authorsmain_book 的书籍的成本。 请记住,正如您在 cmets 和 questions 中所说的,只有那些具有相同作者集合的书籍才会被考虑,不多也不少。

【讨论】:

  • 我们可以使用单个查询还是使用注释来完成,这样我就不必重新格式化我的数据以在每个查询集中添加 total_cost ?
  • 我找不到。
猜你喜欢
  • 2014-02-12
  • 2020-01-12
  • 1970-01-01
  • 1970-01-01
  • 2016-07-21
  • 2011-07-31
  • 2013-01-27
  • 2021-01-01
  • 2014-12-25
相关资源
最近更新 更多