【问题标题】:Group by in Django with field distinction在 Django 中按字段区分分组
【发布时间】:2021-08-31 10:05:25
【问题描述】:

我有两张表,一张用于产品,一张用于供应商,我做了一个查询,返回如下:

select 
    f.nome, f.cnpj, sum(p.quantidade) as "Quantidade de Produtos", 
    count(distinct categoria_id) as "Categorias com Produtos "
from 
    core_produtos p
inner join 
    core_fornecedor f
on 
    p.fornecedor_id=f.id
group by 
    f.nome, f.cnpj
order by 
    f.nome ASC;

然后她返回一个像这样的表格:

     nome     |        cnpj        | Quantidade de Produtos | Categorias com Produtos  
--------------+--------------------+------------------------+--------------------------
 fornecedor 1 | 10.331.608/0001-52 |                   7339 |                        5
 fornecedor 2 | 00.333.725/0001-00 |                   7673 |                        5
 fornecedor 3 | 88.550.421/0001-37 |                   8423 |                        5
 fornecedor 4 | 03.251.500/0001-94 |                  14101 |                        5
 fornecedor 5 | 25.862.630/0001-04 |                   8988 |                        5

我在相关表格中的模型:

class Produtos(models.Model):

    categoria = models.ForeignKey(
        Categoria, related_name="produtos", on_delete=models.CASCADE)
    fornecedor = models.ForeignKey(
        Fornecedor, related_name="fornecedores", on_delete=models.CASCADE, max_length=225)
    nome = models.CharField(max_length=255)
    descricao = models.TextField(blank=True)
    preco = models.DecimalField(max_digits=10, decimal_places=2)
    quantidade = models.IntegerField(default=0)
    disponivel = models.BooleanField(default=True)

    class Meta:
        verbose_name = "Produto"
        verbose_name_plural = "Produtos"

    def __str__(self):
        return self.nome
class Fornecedor(models.Model):

    nome = models.CharField(max_length=255)
    cnpj = models.CharField(max_length=20, unique=True)

    class Meta:
        verbose_name = "Fornecedo"
        verbose_name_plural = "Fornecedores"

    def __str__(self):
        return self.cnpj

我的问题是: 如何使用 django 的 ORM 进行查询?

【问题讨论】:

  • 给你 Django 的模型定义会有所帮助。
  • 对不起,我没听懂
  • 要使用Django的ORM,你必须声明models。你这样做了吗?如果是,您能否提供模型的定义?
  • 准备好了,我贴在这里
  • 好的,抱歉,我是新来的

标签: python sql django postgresql


【解决方案1】:

您可以使用annotate() 实现此目的:

from django.db.models import Sum, Count

Fornecedor.objects.annotate(
    quantidade_de_produtos=Sum("fornecedores__quantidade"),
    categorias_com_produtos=Count("categoria__id", distinct=True),
).order_by("nome")

这将返回一个QuerySet,其中每个实例将具有包含注释结果的quantidade_de_produtoscategorias_com_produtos 属性。


使用lookup that span relationshipsFornecedor 表的quantidade 字段上完成注释。这是使用两个下划线 __ 来遍历关系(在本例中为 fornecedoresquantidade,它们都是 ForeignKey)。

【讨论】:

  • 它成功了,非常感谢,但你也可以和我谈谈,我尝试使用注释几次但我不能。如果它在 produtos 表中,我不明白他如何访问带有 quantidade 列的表
  • @pedrolukas 用更多信息编辑了我的答案
猜你喜欢
  • 2016-09-07
  • 1970-01-01
  • 2014-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-28
  • 2021-01-27
  • 1970-01-01
相关资源
最近更新 更多