我有一个 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()
)
)
试试这个:
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()
)
)