在 Django 查询集中添加和注释字段

问题描述 投票:0回答:1

我有一个 Django 应用程序。我有 3 个这样的 Django 模型:

//型号1:

class ModelAOrders(models.Model):
    id = models.CharField(primary_key=True, max_length=16)
    plant_num = models.ForeignKey(Plant, db_column='plant_num', db_index=True, on_delete=models.CASCADE)
    purchase_order_num = models.CharField(max_length=10)
    purchase_order_item_num = models.CharField(max_length=5)
    material_num = models.ForeignKey(Material, db_column='material_num', db_index=True, on_delete=models.CASCADE)
    current_delivery_dt = models.DateField(null=True)
    lastest_delivery_dt_modification_dt = models.DateField(null=True)
    .....
    [Other Fields]

    class Meta:
        db_table = 'modelA_po'

//型号2:

class ModelBFlags(models.Model):
    purchase_order = models.ForeignKey(OpenPurchaseOrder, null=True, on_delete=models.CASCADE)
    purchase_order_num = models.CharField(max_length=10)
    purchase_order_item_num = models.CharField(max_length=5)
    shipped_flg = models.BooleanField(default=False)
    delivered_flg = models.BooleanField(default=False)
    expedite_flg = models.BooleanField(default=False)

    class Meta:
        db_table = 'modelB_flags'

//型号3:

class ModelCBackorders(models.Model):
    bo_id = models.CharField(max_length=255, blank=True, null=True)
    bo_start_date = models.DateField(blank=True, null=True)
    bo_end_date = models.DateField(blank=True, null=True)
    material_num = models.ForeignKey(Material, db_column='material_num', db_index=True, on_delete=models.CASCADE)
    mrpcn = models.CharField(max_length=3, blank=True, null=True)
    mrpcn_mapping = models.ForeignKey(MrpcnMapping, null=True, on_delete=models.CASCADE)
    planned_delivery_time_value = models.FloatField(null=True)
     ....
    [Other Fields]
    
    class Meta:
        db_table = 'modelC_backorders'

如何根据下面的 SQL 代码将带注释的字段添加到我的延期交货查询集中:

SQL 等效项:

SELECT SUM(distinct(opo.outstanding_qty)) FROM apple.modelC_backorders kb
LEFT JOIN apple.modelA_po opo ON kb.material_num = opo.material_num
LEFT JOIN apple.modelB_flags iof
ON  opo.id = iof.purchase_order_id
WHERE iof.shipped_flg=1 AND opo.outstanding_qty>0
GROUP BY kb.material_num, opo.purchase_order_num, opo.purchase_order_item_num;

这是我到目前为止所拥有的,但它对所有值都返回 null。

backorders_queryset = ModelCBackorders.objects.annotate(
    inbound_shipped_qty=Subquery(
        ModelAOrders.objects.filter(
            material_num=OuterRef('material_num'),  
            modelbflags__shipped_flg=True,
            outstanding_qty__gt=0
        ).annotate(
            total_outstanding_qty=Sum('outstanding_qty', distinct=True)
        ).values('total_outstanding_qty')[:1],
        output_field=IntegerField()
    )
)
python django django-models django-rest-framework django-queryset
1个回答
0
投票

试试这个:

from django.db.models import Sum, OuterRef, Subquery, F

backorders_queryset = ModelCBackorders.objects.annotate(
    inbound_shipped_qty=Subquery(
        ModelAOrders.objects.filter(
            material_num=OuterRef('material_num'),  
            modelbflags__shipped_flg=True,
            outstanding_qty__gt=0
        ).values('material_num').annotate(
            total_outstanding_qty=Sum('outstanding_qty')
        ).values('total_outstanding_qty')[:1],
        output_field=IntegerField()
    )
)
© www.soinside.com 2019 - 2024. All rights reserved.