gpt4 book ai didi

python - Django基于外键关系的sum(涉及3个模型)

转载 作者:行者123 更新时间:2023-12-01 06:26:47 25 4
gpt4 key购买 nike

我有以下问题:我有 3 个模型:Contrato、Movimiento 和 MovimientoDato,我需要生成一个查询集,该查询集向我抛出每个 Contrato 的 MovimientoDato 字段导入的总和,MovimientoDato 链接到 Movimiento 并且 Movimiento 链接通过外键到 Contrato在生成的查询集中,我需要所有 Contrato 字段加上一个我们可以称为“余额”的字段,该字段使用 Movimiento 作为桥梁来汇总与每个契约(Contract)相关的 MovimientoDato.importe 的金额以生成 SUM 组,这可能吗?

以下是模型:

class Movimiento(models.Model):
fecha = models.DateField(default=timezone.now)
contrato = models.ForeignKey(Contrato, related_name='rn_contratos',
on_delete=models.CASCADE)
OPCIONES = (
(1, 'Abono'),
(2, 'Cargo'),
)
tipomovimiento = models.IntegerField(choices=OPCIONES, default=1)
formapago = models.ForeignKey(
FormaPago, on_delete=models.CASCADE, null=True, blank=True)
nota = models.CharField(max_length=255, blank=True)
archivo = models.FileField(upload_to='images/', blank=True)
user = models.ForeignKey(User, on_delete=models.CASCADE)

class MovimientoDato(models.Model):
movimiento = models.ForeignKey(
Movimiento, related_name='partidas', on_delete=models.CASCADE)
categoria = models.ForeignKey(Categoria, on_delete=models.CASCADE)
concepto = models.CharField(max_length=150, verbose_name="Concepto")
importe = models.DecimalField(max_digits=12, decimal_places=2, default=0)

class Contrato(models.Model):
propiedad = models.ForeignKey(Propiedad, on_delete=models.CASCADE)
inquilino = models.ForeignKey(Inquilino, on_delete=models.CASCADE)
fechainicio = models.DateField(default=datetime.now)
fechafinal = models.DateField(default=datetime.now)
renta_check = models.BooleanField(default=True)
renta = models.DecimalField(max_digits=15, decimal_places=2, default=0)
mantenimiento_check = models.BooleanField(default=True)
mantenimiento = models.DecimalField(
max_digits=15, decimal_places=2, default=0)
agua_check = models.BooleanField(default=True)
agua = models.DecimalField(max_digits=15, decimal_places=2, default=0)
electricidad_check = models.BooleanField(default=True)
electricidad = models.DecimalField(
max_digits=15, decimal_places=2, default=0)
deposito = models.DecimalField(max_digits=15, decimal_places=2, default=0)
status = models.BooleanField(default=True)
user = models.ForeignKey(User, on_delete=models.CASCADE)

我已经搜索了如何使用 itertools、Q()、F() 来实现它,但我无法让它工作

非常感谢

最佳答案

是的,您可以.annotate(..) [Django-doc] Contrato 查询集:

from django.db.models import <b>Sum</b>

Contrato.objects.annotate(
<b>balance=Sum('rn_contratos__partidas__importe')</b>
)

this 查询集产生的 Contrato 对象将具有一个额外的属性 .balance,它是 .importe 的总和所有相关的MovimientoDato(通过Movimiento模型)。

关于python - Django基于外键关系的sum(涉及3个模型),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60102186/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com