跟踪多个外键字段总和的最佳方法[Django]
Best way to keep track of the sum of the field of multiple foreign keys [Django]
如果你能想出更好的方式来表达我的问题,无论如何,请改变它。这是我面临的情况。
我有 2 个模型:Agent
、Deal
。这是它们的简化版本:
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
和所需值的字典。
来源:
- https://docs.djangoproject.com/en/3.0/topics/db/aggregation/
- https://docs.djangoproject.com/en/3.0/ref/models/querysets/
希望这就是您所需要的!
如果你能想出更好的方式来表达我的问题,无论如何,请改变它。这是我面临的情况。
我有 2 个模型:Agent
、Deal
。这是它们的简化版本:
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
和所需值的字典。
来源:
- https://docs.djangoproject.com/en/3.0/topics/db/aggregation/
- https://docs.djangoproject.com/en/3.0/ref/models/querysets/
希望这就是您所需要的!