如何在Django中用一个模型的值更新另一个模型的值

csbfibhn  于 2023-02-05  发布在  Go
关注(0)|答案(2)|浏览(240)
class Trade(models.Model):
    pips = models.FloatField(default=0)
    direction = models.CharField(max_length=30)
    new_balance = FloatField(default=0.0)
...

class Summary(models.Model):
    winning_trades = models.IntegerField(default=0)
    account_balance = FloatField(default=0.0)
...

当一个用户发布一个请求时,他/她将填充交易模型,这将更新汇总模型,并将新的汇总数据发送回用户。

jogvjijk

jogvjijk1#

您很可能在寻找Django Signals,您希望Trade模型的create事件触发侦听器将接收和处理的post_save信号。
假设您已将模型保存在文件models.py中,
使用以下内容创建文件signals.py

# code
from django.db.models.signals import post_save
from django.dispatch import receiver
from .models import Trade, Summary
 
 
@receiver(post_save, sender=Trade)
def update_summary(sender, instance, created, **kwargs):
    if created:
        # query to update Summary as needed

您必须将信号添加到应用程序配置中。
在相关应用程序的apps.py中,添加以下内容:

from django.apps import AppConfig
 
class AppnameConfig(AppConfig):
    name = 'appname'
 
    **def ready(self):
        import appname.signals**
5w9g7ksd

5w9g7ksd2#

首先,我将鼓励您创建一个事务来执行这两个操作,如果第二个失败,您的数据库将保持一致。
然后,Django允许你覆盖模型方法,比如save,你可以尝试如下:

class Trade():
  ...
  def save(self, *args, **kwargs):
    with transaction.atomic():
      super.save()
      update_summary()

然后,在视图中,您可以查询最近更新的Summary并返回它。

class TradeViewSet():
  def create(self, request, *args, **kwargs):
    user = request.user
    trade = Trade.create(request.data)
    updated_summary = get_summary(user.id)
    response = SummarySerializer(updated_summary)
    return Response(response)

相关问题