对Django中多个模型的总金额进行汇总

对Django中多个模型的总金额进行汇总,django,django-models,django-views,Django,Django Models,Django Views,我问题的标题已经说明了一切。我有多个模型,我想把总数加起来,得出总数,这是我的代码 class FurnitureItem(models.Model): fur_title = models.CharField(max_length=200) fur_price = models.FloatField() fur_discount_price = models.FloatField(blank=True, null=True) fur_pictures = mo

我问题的标题已经说明了一切。我有多个模型,我想把总数加起来,得出总数,这是我的代码

class FurnitureItem(models.Model):
    fur_title = models.CharField(max_length=200)
    fur_price = models.FloatField()
    fur_discount_price = models.FloatField(blank=True, null=True)
    fur_pictures =  models.ImageField(upload_to='Pictures/', blank=True)
    label = models.CharField(choices=LABEL_CHOICES, max_length=1)
    category = models.CharField(choices=CATEGORIES_CHOICES, max_length=24)
    fur_descriptions = models.TextField()
    slug = models.SlugField()
    date = models.DateTimeField(default=timezone.now)

    def __str__(self):
        return self.fur_title

        
class FurnitureOrderItem(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    fur_ordered = models.BooleanField(default=False)
    item = models.ForeignKey(FurnitureItem, on_delete=models.CASCADE)
    quantity = models.IntegerField(default=1)

    def __str__(self):
        return f"{self.quantity} of {self.item.fur_title}"
    ....
    
    def get_final_fur_price(self):
        if self.item.fur_discount_price:
            return self.get_total_discount_fur_price()
        return self.get_total_item_fur_price()

    
class FurnitureOrder(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    fur_items = models.ManyToManyField(FurnitureOrderItem)
    date_created = models.DateTimeField(auto_now_add=True)
    ordered_created = models.DateTimeField()
    fur_ordered = models.BooleanField(default=False)
    def __str__(self):
        return self.user.username

    def get_total_fur_everything(self):
        total = 0
        for fur_order_item in self.fur_items.all():
            total += fur_order_item.get_final_fur_price()
        return total



class GraphicItem(models.Model):
    graphic_title = models.CharField(max_length=200)
    graphic_price = models.FloatField()
    graphic_discount_price = models.FloatField(blank=True, null=True)
    graphic_pictures =  models.ImageField(upload_to='Pictures/', blank=True)
    label = models.CharField(choices=LABEL_CHOICES, max_length=1)
    category = models.CharField(choices=CATEGORIES_CHOICES, max_length=24)
    graphic_descriptions = models.TextField()
    slug = models.SlugField()
    date = models.DateTimeField(default=timezone.now)

    def __str__(self):
        return self.graphic_title
    
    
class GraphicOrderItem(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    graphic_ordered = models.BooleanField(default=False)
    item = models.ForeignKey(GraphicItem, on_delete=models.CASCADE)
    quantity = models.IntegerField(default=1)

    def __str__(self):
        return f"{self.quantity} of {self.item.graphic_title}"

    ....

    def get_final_graphic_price(self):
        if self.item.graphic_discount_price:
            return self.get_total_discount_graphic_price()
        return self.get_total_item_graphic_price()

    
class GraphicOrder(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    graphic_items = models.ManyToManyField(GraphicOrderItem)
    date_created = models.DateTimeField(auto_now_add=True)
    ordered_created = models.DateTimeField()
    graphic_ordered = models.BooleanField(default=False)
    def __str__(self):
        return self.user.username

    def get_total_graphic_everything(self):
        total = 0
        for graphic_order_item in self.graphic_items.all():
            total += graphic_order_item.get_final_graphic_price()
        return total
我试着总结家具和图形的数量

class TotalAmount(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    graphic_items = models.ManyToManyField(GraphicOrderItem)
    fur_items = models.ManyToManyField(FurnitureOrderItem)
    date_created = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.user.username

    def amount(self):
        return self.graphic_items.get_total_graphic_everything() + self.fur_items.get_total_fur_everything()

然后我的观点是这样的:

class Summary(LoginRequiredMixin, View):
    def get(self, *args, **kwargs):
        try:
            fur_order = FurnitureOrder.objects.get(user=self.request.user, fur_ordered=False)
            graphic_order = GraphicOrder.objects.get(user=self.request.user, graphic_ordered=False)
            amount = TotalAmount.objects.get(user=self.request.user)
            
            context = {
            'fur_order':fur_order,'graphic_order':graphic_order,'amount':amount}
            return render(self.request, 'business/home-order-summary.html', context)
        

谢谢您的时间,我不知道代码很长,但我想解释得更好。

看起来您发布了一个解决方案。这个代码不起作用吗?@Alex Vyushkov,我还没找到答案,因为我试图将我的金额传递到我的模板中,但我得到了一个空白页。以下是我在模板中所做的:
{%for amount%}{{amount.amount}{%endfor%}
但我的模板(web浏览器)上似乎没有显示任何内容
摘要中的
get
函数看起来不正确<代码>在不使用
的情况下尝试
,除非
无效。也许在调试这个问题时删除
试试
?@Alex Vyushkov,据我所知,你说我应该取消get函数,对吗?如果我不打扰你,你能做一个小说明吗?我将不胜感激。Thanks@AlexVyushkov,我现在明白你的意思了,但是get函数将self作为一个参数,这就是为什么在我的try语句中,你可以看到类似于
fur\u order=FurnitureOrder.objects.get(user=self.request.user,fur\u order=False)的东西(user=self.request.user,graphic\u ordered=False)
。谢谢,欢迎任何意见