es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo intersectar dos conjuntos de consultas en Django?

Tengo dos consultas. Una de ellas tiene el identificador de producto vendido y el monto de venta, la otra tiene el identificador de producto y el precio del producto.

query_product = Model1.objects.filter(...).values_list('ProductID', 'ProductPrice')
query_sale = Model2.objects.filter(...).values_list('SaleProductID', 'ProductAmount')

Quiero calcular SI SaleProductID = ProductID, Sum(F(‘ProductPrice’) * F(‘ProductAmount’)). Sin embargo, no pude encontrar cómo hacerlo con la consulta. Nota: Model2 tiene una clave externa en Model1.

¿Tienes alguna sugerencia? ¡Gracias!

EDIT: Quiero mostrar el monto total en el sitio de administración en la clase PBGelenSiparis. Aquí está el modelo completo traducido:

class PBUrun(models.Model):
    PBUrunNu = models.IntegerField(verbose_name='Código del producto')
    PBUrunName = models.CharField(verbose_name='Nombre del producto', max_length=200)
    PBUrunPrice = models.DecimalField(verbose_name='Precio del producto', max_digits=10, decimal_places=2)

class PBGelenSiparis(models.Model):
    pburun = models.ForeignKey(PBUrun, verbose_name='Seleccionar producto', on_delete=models.CASCADE)
    PBGelSipNu = models.AutoField(verbose_name='Número de orden', primary_key=True)

    def GelenSiparisTutari(self):
        find_ordered_products = PBGelenSiparisUrun.objects.filter(pbgelensiparis_id=self.PBGelSipNu)\
        .values('pburun_id')

        order_product_price = PBUrun.objects.filter(PBUrunNu__in=siparis_urunlerini_bul).values_list('PBUrunNu', 'PBUrunFiyat')
        order_product_amount = PBGelenSiparisUrun.objects.filter(pbgelensiparis_id=self.PBGelSipABNu).values_list('pburun_id', 'PBGelSipUrunAdet')

class PBGelenSiparisUrun(models.Model):
    pburun = models.ForeignKey(PBUrun, verbose_name='Seleccionar producto', on_delete=models.CASCADE)
    pbgelensiparis = models.ForeignKey(PBGelenSiparis, verbose_name='Orden', on_delete=models.CASCADE)
    PBGelSipUrunAdet = models.IntegerField(verbose_name='Cantidad de la orden')
Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para calcular la cantidad total de productos vendidos, puedes utilizar la siguiente consulta:

    from django.db.models import F, Sum
    
    total_amount = Model2.objects.filter(SaleProductID=F('ProductID')).annotate(
        total_sale=Sum(F('ProductPrice') * F('ProductAmount'))
    ).values_list('SaleProductID', 'total_sale')
    

    Esta consulta filtra las instancias de Model2 donde SaleProductID es igual a ProductID, y luego anota cada instancia con un campo total_sale que es el resultado de multiplicar ProductPrice y ProductAmount. Finalmente, la consulta devuelve una lista de tuplas que consisten en los valores de SaleProductID y total_sale.

    En tu caso, puedes incorporar esta consulta en el método GelenSiparisTutari de la clase PBGelenSiparis para calcular la cantidad total de productos ordenados:

    from django.db.models import F, Sum
    
    class PBGelenSiparis(models.Model):
        # ...
    
        def GelenSiparisTutari(self):
            ordered_products = PBGelenSiparisUrun.objects.filter(
                pbgelensiparis_id=self.PBGelSipNu
            ).values_list('pburun_id', flat=True)
    
            total_amount = PBGelenSiparisUrun.objects.filter(
                pbgelensiparis_id=self.PBGelSipNu,
                pburun_id__in=ordered_products
            ).annotate(
                total_price=Sum(F('pburun__PBUrunPrice') * F('PBGelSipUrunAdet'))
            ).values_list('pburun_id', 'total_price')
    
            return sum([amount for product, amount in total_amount])
    

    Esta implementación primero encuentra todos los productos ordenados, luego calcula la cantidad total para cada producto utilizando la consulta que hemos definido. Finalmente, suma todas las cantidades para obtener el monto total del pedido.

Comments are closed.