如果一个值大于另一个值,则过滤查询集

时间:2016-06-04 22:57:29

标签: django

我试图根据2个字段之间的关系来查看我的查询集。

然而总是得到我的字段未定义的错误。

我的模型有几个计算列,我想只得到字段A的值大于字段B的记录。

所以这是我的模特

class Material(models.Model):
    version = IntegerVersionField( )
    code = models.CharField(max_length=30)
    name = models.CharField(max_length=30)
    min_quantity = models.DecimalField(max_digits=19, decimal_places=10)
    max_quantity = models.DecimalField(max_digits=19, decimal_places=10)
    is_active = models.BooleanField(default=True)
    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'))


    totalinventory = 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'))  

    totalpo = 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'))  

    totalso = property(_get_totalpo)


    @property
    def _get_total(self):
        return (totalinventory + totalpo - totalso) 

    total = property(_get_total)

在我看来,这是我尝试获取条件查询集

的行
 po_list = MaterialFilter(request.GET, queryset=Material.objects.filter( total__lte =  min_quantity  ))

但是我收到了min_quantity未定义的错误

可能是什么问题?

编辑:

我的问题解决了,谢谢@Moses Koledoye,但是在相同的代码中我现在有不同的问题

  

无法将关键字'total'解析为字段。选项包括:am,author,author_id,bom,bomversion,code,creation_time,description,id,inventory,is_active,is_production,itemgroup,itemgroup_id,keywords,materialuom,max_quantity,min_quantity ,名称,pomaterial,产品,产品,slug,trigger_quantity,uom,updated_by,updated_by_id,valid_from,valid_to,version,warehousebin

基本上它没有显示我在模型中的任何计算字段。

1 个答案:

答案 0 :(得分:4)

Django无法编写以值未知的字段为条件的查询。您需要使用F表达式:

from django.db.models import F

queryset = Material.objects.filter(total__lte = F('min_quantity'))

您的FilterSet变为:

po_list = MaterialFilter(request.GET, queryset = Material.objects.filter(total__lte=F('min_quantity')))

来自docs

  

F()对象表示模型字段的值或已注释   柱。它可以引用模型字段值和   使用它们执行数据库操作而不必实际拉动   他们从数据库中进入Python内存