1

我有 2 个 django 模型,由于遗留系统,它们没有被 ForeignKey 链接

class Parent(model):
    name -> CharField()

class Child(model)
    parent_name -> CharField()
    cost        -> IntegerField()

我想实现一个左连接,它为我提供所有父列以及来自子项的成本列的总和。postgres 中的 SQL 转换为

select parent.name, sum(child.cost) as cost from parent join child on parent.name = child.parent_name group by parent.name;

有没有办法用 django ORM 实现这一点

我已经尝试了很多东西,但https://code.djangoproject.com/ticket/28296可能是阻塞的。

4

1 回答 1

1

请使用 aForeignKey来指代父母,而不是CharField连接名称的 a 。这将保证引用完整性,避免数据重复,并使在 Django 中查询更方便。

因此,您将模型定义为:

class Parent(models.Model):
    name = models.CharField(max_length=128)

class Child(models.Model):
    parent = models.ForeignKey(
        Parent,
        on_delete=models.CASCADE
    )
    cost = models.IntegerField()

或者如果 的nameParent唯一的,您可以让它引用name

class Parent(models.Model):
    name = models.CharField(max_length=128, unique=True)

class Child(models.Model):
    parent = models.ForeignKey(
        Parent,
        to_field='name',
        db_column='parent_name',
        on_delete=models.CASCADE
    )
    cost = models.IntegerField()

然后你可以.annotate(…)[Django-doc]Parent模型:

from django.db.models import Sum

Parent.objects.annotate(
    cost=Sum('child__cost')
)

Parent从此查询集中产生的对象将具有一个额外的属性.cost,该属性将包含指向该costs 的 s的总和。ChildParent

于 2022-02-20T13:29:08.013 回答