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

问题描述 投票:1回答:1

[如果您能想出更好的方式来表达我的问题,请进行更改。这就是我面临的情况。

我有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的新手,所以如果我忽略了某些明显的地方,我深表歉意。

django celery celerybeat
1个回答
1
投票

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

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

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

此行的结果是一个包含具有所需值的price_sum_of_all_deals的字典。

来源:

我希望那是您所需要的!

© www.soinside.com 2019 - 2024. All rights reserved.