【问题标题】:how to get total price of books django?如何获得书籍 django 的总价?
【发布时间】:2020-12-17 10:02:43
【问题描述】:

如果我在商店中添加一些书籍,那么我如何获得商店中所选书籍的总价格?

信号不起作用,它们不是calculating anything。我想计算selected books。提交表格后,我一无所有,总价是still (0)

signals.py code

models.py code

商店

from django.db import models

class Book(models.Model):
    name = models.CharField(max_length=100)
    price = models.IntegerField(default=0)


class Store(models.Model):     
    keeper = models.ForeignKey(User, on_delete=models.SET_NULL,null=True)
    books = models.ManyToManyField(Book)
    total_price = models.IntegerField(default=0)

信号.py

from django.db.models import Sum
from django.db.models.signals import pre_save
from django.dispatch import receiver

from .models import Store
from .models import Book


@receiver(pre_save, sender=Store)
def save_total_price(sender, instance, **kwargs):
    instance.total = Book.objects.all().aggregate(Sum("price"))["price__sum"]

apps.py

from django.apps import AppConfig


class ReportConfig(AppConfig):
    name = 'report'

    def ready(self):
        import report.signals

初始化.py

default_app_config = "report.apps.ReportAppConfig"

【问题讨论】:

  • 你不需要重写保存方法只需创建一个用@property装饰的函数并使用相同的聚合逻辑返回一个值
  • 是的,我必须尝试这个函数你想建议我如何定义这个函数并解决这个错误?
  • 您确定需要将其存储在数据库中吗?也可以添加一个方法Store类来动态获取这个值

标签: django django-models django-views django-signals


【解决方案1】:

您可以为此使用信号。

在您的应用程序中创建一个文件singals.py

@receiver(pre_save, sender=Store)
def save_total_price(sender, instance, **kwargs):
    instance.total = Book.objects.all().aggregate(Sum("price"))["price__sum"]

在应用程序的配置中连接你的信号,如下所示:

# app.py
class WhateverAppConfig(AppConfig):
    name = "{app_path}"

    def ready(self):
        import {app_path}.signals

现在指向应用程序的__init__.py,配置如下:

default_app_config = "{app_path}.apps.WhateverAppConfig"

其他解决方案可能包括保存该信息的缓存变量(我认为这是更好的方法)。

【讨论】:

  • 是的,我试过这个代码我得到了这个错误raise ValueError('"%r" needs to have a value for field "%s" before ' ValueError: "<Store: dsg fsf>" needs to have a value for field "id" before this many-to-many relationship can be used.
  • 知道了,我理解错了我已经编辑了帖子。您现在可以检查如何操作。
  • 是的,亲爱的!当我尝试保存 StoreForm' object has no attribute 'instence' 时出现错误。
  • 您在instence 中有错字。还有你从哪里得到这个错误的?
  • 信号不起作用它没有计算任何东西?
【解决方案2】:

您需要使用m2m_changed 在信号中定义一个函数,我认为如果您想将 total_price 保存到数据库中,这是更好的方法。感谢大家帮助我。这段代码对我来说很好。 :)

def save_total_price(sender, instance, action, *args, **kwargs):
    if action in ['post_add', 'post_remove', 'post_clear']:
        books = instance.books.all()
        instance.total_price = 0
        for book in books:
            instance.total_price += book.price
            instance.save()


m2m_changed.connect(save_total_price, sender=Patient.books.through)

【讨论】:

    猜你喜欢
    • 2021-11-13
    • 1970-01-01
    • 2019-08-29
    • 1970-01-01
    • 2021-05-17
    • 2021-04-30
    • 2020-10-05
    • 1970-01-01
    • 2019-03-31
    相关资源
    最近更新 更多