我有一个模型,我计算总数
class Material(models.Model):
version = IntegerVersionField( )
code = models.CharField(max_length=30)
name = models.CharField(max_length=30)
slug = models.SlugField(max_length=80, blank=True)
description = models.TextField(null=True, blank=True)
min_quantity = models.DecimalField(max_digits=19, decimal_places=10)
def _get_totalinventory(self):
from inventory.models import Inventory
return Inventory.objects.filter(warehouse_Bin__material_UOM__UOM__material=self.id, is_active = True).aggregate(Sum('quantity'))
total_inventory = property(_get_totalinventory)
def _get_totalpo(self):
from purchase.models import POmaterial
return POmaterial.objects.filter(material=self.id, is_active = True).aggregate(Sum('quantity'))
total_po = property(_get_totalpo)
def _get_totalso(self):
from sales.models import SOproduct
return SOproduct.objects.filter(product__material=self.id , is_active=True ).aggregate(Sum('quantity'))
total_so = property(_get_totalso)
到目前为止,我的计算字段正确计算并显示在模板中没有任何问题
因为我无法直接通过属性过滤正如我所建议的那样使用python list comprehension
所以这就是我写的,它确实给了我输出而没有错误。
po_list = [n for n in Material.objects.all()
if ((F('total_inventory') + F('total_po') - F('total_so')) < F('min_quantity'))]
但是,当前列表理解并未正确过滤 我得到的输出应该被过滤掉。我做错了什么?
它不会过滤任何只是返回列表的内容
答案 0 :(得分:1)
我怀疑你可以在模型类方法上调用F
。您可以直接从列表推导中的对象调用方法:
po_list = [n for n in Material.objects.all() if (n.total_inventory['quantity__sum']
+ n.total_po['quantity__sum']
- n.total_so['quantity__sum'])
< n.min_quantity]