首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >怎样才能得到书的总价呢?

怎样才能得到书的总价呢?
EN

Stack Overflow用户
提问于 2020-08-28 13:01:11
回答 2查看 366关注 0票数 0

如果我在商店中添加了一些书籍,那么我如何才能在商店中获得所选书籍的total_price?

信号不起作用--它们不是计算任何东西。我想计算一下选编书。在提交表格后,我得到的总价格是仍(0)

signals.py代码

models.py代码

商店

代码语言:javascript
运行
复制
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)

signals.py

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
from django.apps import AppConfig


class ReportConfig(AppConfig):
    name = 'report'

    def ready(self):
        import report.signals

init.py

代码语言:javascript
运行
复制
default_app_config = "report.apps.ReportAppConfig"
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-08-28 13:28:23

你可以用一个信号。

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

代码语言:javascript
运行
复制
@receiver(pre_save, sender=Store)
def save_total_price(sender, instance, **kwargs):
    instance.total = Book.objects.all().aggregate(Sum("price"))["price__sum"]

在App的Config中连接您的信号,如下所示:

代码语言:javascript
运行
复制
# app.py
class WhateverAppConfig(AppConfig):
    name = "{app_path}"

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

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

代码语言:javascript
运行
复制
default_app_config = "{app_path}.apps.WhateverAppConfig"

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

票数 1
EN

Stack Overflow用户

发布于 2020-08-30 01:41:14

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

代码语言:javascript
运行
复制
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)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63634305

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档