Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在Django中获得同一类以前对象的总值?_Python_Django - Fatal编程技术网

Python 如何在Django中获得同一类以前对象的总值?

Python 如何在Django中获得同一类以前对象的总值?,python,django,Python,Django,我用Django编写了自己的计费软件。我有一个叫做比尔的模型。每一张账单都有价格价值。现在我想给bill模型一个函数,它将所有以前的bill和当前bill的价格值相加。这个函数的目的是给我一个我迄今为止挣了多少钱的数字 但每次我尝试实现它时,我都会遇到一个问题,即我不能在其自身的定义中使用bill类 向我的bill类中添加一个函数以获取所有bill对象(包括当前对象)并将价格值相加的最佳方法是什么?我感觉到我误解了一些东西,但为什么不这样做呢 class Bill(models.Model):

我用Django编写了自己的计费软件。我有一个叫做比尔的模型。每一张账单都有价格价值。现在我想给bill模型一个函数,它将所有以前的bill和当前bill的价格值相加。这个函数的目的是给我一个我迄今为止挣了多少钱的数字

但每次我尝试实现它时,我都会遇到一个问题,即我不能在其自身的定义中使用bill类


向我的bill类中添加一个函数以获取所有bill对象(包括当前对象)并将价格值相加的最佳方法是什么?

我感觉到我误解了一些东西,但为什么不这样做呢

class Bill(models.Model):
    due_date = models.DateField()
    price = models.IntegerField()
    paid = models.BooleanField()

    def get_previous_bills(self):
        return Bill.objects.filter(due_date__lte=timezone.now(), paid=True)

    def get_total_price(self):
        return sum(p.price for p in self.get_previous_bills())

您是否使用Django ORM将账单存储在数据库中?如果是这样,请使用ORM查询DB以获取所有账单:。但如果我在bill类中执行Rechnung.objects.filter(nummer>=self.nummer)(nummer是一个id,Rechnung表示账单),则表示未定义nummer。在这个类之外,代码按预期工作。请参阅我的评论,使用
nummer\uu gte=self.nummer
。这是在运行时计算的,因此如果您已将nummer字段设置为值,则不应看到此错误。如果您需要更多帮助,请使用您尝试过的简化版本更新您的Q。@JasonTS而不是此
Rechnung.objects.filter(nummer>=self.nummer)
,您必须编写类似的内容,
Rechnung.objects.filter(nummer\uu gte=self.nummer)
。请记住,Django与常规Python没有什么不同:方法调用(如
filter
)采用普通的关键字样式参数:在本例中,键是
nummer\uu gte
,值是
self.nummer
。该键有效地使用了一种特殊的Django语法,告诉ORM您希望使用
=
运算符将每个Rechnung的numer属性与您传递的值进行比较。在这种情况下,您可能应该使用Manager,并在该Manager中具有get_previous_bills函数。然后,您可以使用self.objects.filter(due\u date\u lte=timezone.now(),paid=True)和call Bill.objects.get\u previous\u bills()@MarioGudelj interest-我对Django很陌生,所以我很少与定制经理打交道。与静态方法相比,使用管理器的优势是什么?