在Django子查询中使用Annotate和Artithmetic

时间:2018-12-26 20:42:24

标签: django django-queryset

我正在努力增进对Django queryset语法的理解,并希望有人可以帮助我检查一下我的理解。

这可以吗?

total_packed = (
    PackingRecord.objects.filter(
        product=OuterRef('pk'), fifolink__sold_out=False
    ).values('product')  # Group by product
    .annotate(total=Sum('qty'))  # Sum qty for 'each' product
    .values('total')
    )
total_sold = (
    FifoLink.objects.filter(
        packing_record__product=OuterRef('pk'), sold_out=False
    ).values('packing_record__product')
    .annotate(total=Sum('sale__qty'))
    .values('total')
    )
output = obj_set.annotate(
        sold=Subquery(total_sold[:1]),
        packed=Subquery(total_packed[:1]),
).annotate(
    in_stock=F('packed') - F('sold')
)

请放心地改为:

in_stock = (
    FifoLink.objects.filter(
        packing_record__product=OuterRef('pk'), sold_out=False
    ).values('packing_record__product') 
    .annotate(total=Sum(F('sale__qty')-F('packing_record__qty')))
    .values('total')
    )
output = obj_set.annotate(
        in_stock=Subquery(total_sold[:1]),
)

基本上,我试图通过使用fk关系而不是运行两个单独的查询集,将外部.annotate()中完成的数学运算移入查询集本身。我认为这是允许的,但是我不确定我是否正确理解。

0 个答案:

没有答案