跟踪多个外键字段总和的最佳方法[Django]

Best way to keep track of the sum of the field of multiple foreign keys [Django]

如果你能想出更好的方式来表达我的问题,无论如何,请改变它。这是我面临的情况。

我有 2 个模型:AgentDeal。这是它们的简化版本:

class Agent(models.Model):
    name = models.CharField(max_length=100)
    price_sum_of_all_deals = models.IntegerField()


class Deal(models.Model):
    agent = models.ForeignKey(Agent, on_delete=models.CASCADE)
    address = models.CharField(max_length=100)
    price = models.IntegerField()

我正在使用 celery beat 检查 API 以查看每个代理商是否有任何新交易。使用我当前的配置,我从任务方法中搜索新交易,如果找到交易,我将该交易的价格添加到相应代理的 price_sum_of_all_deals 字段。任务摘要如下所示:

from celery import shared_task
from agents import models

@shared_task
def get_deals():
    agents = models.Agent.objects.all()
    for agent in agents:
        price, address = get_new_deal_from_api(agent.name)
        new_deal = models.Deal(agent=agent, address=address, price=price)
        new_deal.save()

        agent.price_sum_of_all_deals += price
        agent.save()

然而,这不是很直观,感觉像是一种不必要的抽象。有没有更好的方法从模型中计算 price_sum_of_all_deals?这里的最佳做法是什么?

我对 Django 比较陌生,所以如果有什么明显的地方被我忽略了,我深表歉意。

我认为这不是最好的处理方式,因为如果一笔交易被删除,您如何更新 price_sum_of_all_deals?您无法 100% 确定此值始终准确(因此,这是不可接受的)。

这是一种方法,无需将总和值存储在模型的属性中:

  • 照常使用您的 API,
  • 只需创建 Deal 实例并保存,
  • 要随时获取代理的所有交易总和,您可以使用以下方法:
Deal.objects.filter(agent=this_agent).aggregate(price_sum_of_all_deals=Sum('price'))

这一行的结果是一个包含 price_sum_of_all_deals 和所需值的字典。

来源:

希望这就是您所需要的!