首页 > 解决方案 > 复杂的django查询,我不知道怎么做

问题描述

我有一个让我头疼的问题,我无法解决。我不知道如何使用 Django ORM 进行查询以获得正确的结果。我用的是MySQL,情况如下:

楷模:

from django.db.models import Q,F,Sum, Value as V
from django.db.models.functions import Coalesce
from django.db.models.functions import Concat

class Prestamo(models.Model):
    PENDIENTE = 1
    PAGADO = 2
    FUSIONADO = 3
    ANULADO = 4
    ESTADOS = (
        (PENDIENTE, 'pendiente'),
        (PAGADO, 'pagado'),
        (FUSIONADO, 'fusionado'),
        (ANULADO, 'anulado')  

        )

    cliente = models.ForeignKey(Cliente, on_delete = models.CASCADE)
    fecha_prestamo = models.DateField(default=timezone.now)
    capital_prestado = models.FloatField()
    meses_plazo = models.IntegerField()
    porcentaje_aplicado = models.ForeignKey(Interes, on_delete=models.CASCADE)
    valor_interes = models.FloatField(null=True)
    saldo_capital = models.FloatField(null=True)
    saldo_interes = models.FloatField(null=True)
    tipo_prestamo = models.ForeignKey(TiposPrestamo, on_delete=models.CASCADE)
    fecha_registro = models.DateTimeField(default=timezone.now)
    prestamo_nuevo = models.ForeignKey('Prestamo', on_delete=models.CASCADE, blank= True, null=True)
    #estado = models.ForeignKey(EstadoPrestamo, on_delete = models.CASCADE, blank= True, default=1)
    estado = models.IntegerField(choices=ESTADOS, default=PENDIENTE, blank= True)
    observaciones = models.TextField(max_length=150,blank=True)
    usuario = models.ForeignKey(User, on_delete= models.CASCADE, default='')

    def __str__(self):
        return "{0},{1},{2}".format(self.fecha_prestamo, self.cliente, self.capital_prestado)

class Abono(models.Model):
    prestamo = models.ForeignKey(Prestamo,on_delete=models.CASCADE)
    fecha_abono = models.DateField(default=timezone.now)
    valor_abono_capital = models.FloatField()
    valor_abono_interes = models.FloatField()
    observaciones = models.TextField(max_length=100,blank=True,null=True)
    fecha_registro = models.DateTimeField(default=timezone.now)
    estado = models.ForeignKey(EstadoAbono, on_delete = models.CASCADE, blank= True, null=True)
    usuario = models.ForeignKey(User, on_delete= models.CASCADE, default='')

    def __str__(self):
        return "{0},{1}".format(self.fecha_abono, self.valor_abono_capital)


class Descuento(models.Model):
    prestamo = models.ForeignKey(Prestamo,default=None,on_delete=models.CASCADE)
    fecha_descuento = models.DateField(default=timezone.now)
    valor_descuento = models.FloatField()
    fecha_registro = models.DateTimeField(default=timezone.now)
    descontadopor = models.ForeignKey(User, on_delete=models.CASCADE)

    def __str__(self):
        return "descuento: {0}, {1}".format(self.fecha_descuento, self.valor_descuento)

在数据库中,我有以下与以前模型相关的表的示例数据。

Prestamo https://i.stack.imgur.com/FqZ4b.png

阿博诺斯 https://i.stack.imgur.com/MUjRk.png

Descuentos https://i.stack.imgur.com/rAHW0.png

通过django ORM,我试图获得一个列表,其中每笔贷款都通过注册显示,我必须显示的信息是:loan_id,capital_借用,loan_date,百分比,客户,资本支付,折扣和资本余额

由于折扣和资本支付的价值都翻了一番,这当然会影响资本平衡字段,因此我很难显示之前以粗体显示的字段。这是由于自动生成django ORM的左连接

我正在使用 django 更新和 python 3.6、mysql 5.5

我正在使用的 django 查询如下:

查询 mYSQL

但是,之前使用 ORM 的查询给我带来了计算不正确的列表。

我不想使用 sql 查询,而是使用 ORM。但是为我带来我需要的数据的 SQL 查询如下:

它给我带来了以下数据:

https://i.stack.imgur.com/u9tM6.png

借入资本是贷款表中的字段,贷记资本是贷款已经和贷记表中的付款总和,折扣在折扣表中找到。考虑到前面的数据,我计算出满足以下数学公式的资本余额: 资本余额 = loan_value - (credits + discounts)

非常感谢。

标签: pythondjangodjango-modelsdjango-orm

解决方案


推荐阅读