为什么我的Django信号被触发后,我的“friends_list”仍然是空的?

xdyibdwo  于 2023-02-05  发布在  Go
关注(0)|答案(1)|浏览(94)

我正在使用Django post_save信号修改Budget的数据库内容,在响应中我得到了friendsList,其中填充了用户ID,但是当我使用post_save信号查询并将其存储到friends_list中时,我发现列表仍然是空的。
我的回应:

{
    "id": 5,
    "amount": 100,
    "budgetForSplitPay": 1,
    "friendsList": [
      2,
      3
    ]
  }

我的post_save信号码:

@receiver(post_save, sender=SplitPayBudget)
def post_save_splitpay_amount(sender, instance, created, **kwargs):
    Budget.objects.filter(user=instance.budgetForSplitPay.user).update(budgetofUser=F('budgetofUser') - instance.amount)
    friends_list = instance.friendsList.all()

    for friend in friends_list:
        Budget.objects.filter(user=friend.user).update(budgetofUser=F('budgetofUser') - instance.amount)

我的模特:

class SplitPayBudget(models.Model):
    budgetForSplitPay = models.ForeignKey(Budget, on_delete=models.CASCADE, related_name='budgetForSplitPay')
    friendsList = models.ManyToManyField(Budget, related_name='friendsList', blank=True)
    amount = models.IntegerField(default=0)

    def __str__(self):
        return str(self.budgetForSplitPay.user)

触发此信号的API调用主体:

{
  "budgetForSplitPay": "1",
  "amount": 100,
  "friendsList": [2, 3]
}

我的序列化程序:

class SplitPayBudgetSerializer(ModelSerializer): # Actually a TransactionSerializer
    class Meta:
        model = SplitPayBudget
        fields = '__all__'

我想要一个解决方案,我的friends_list应该用[2, 3]初始化。
谢谢你。
我尝试使用friends_list = instance.friendsList.all(),但instance.friendsList.all()仍然是空的。

jtjikinw

jtjikinw1#

所以我接受了@Lax_Sam的提示,使用了m2m_changedpost_add操作来解决我的问题。
信号代码:

@receiver(post_save, sender=SplitPayBudget)
def post_save_splitpay_amount(sender, instance, created, **kwargs):
    Budget.objects.filter(user=instance.budgetForSplitPay.user).update(budgetofUser=F('budgetofUser') - instance.amount)

    
@receiver(m2m_changed, sender=SplitPayBudget.friendsList.through)
def update_budget_for_splitpay(sender, instance, action, **kwargs):
    if action == 'post_add':
        for friend in instance.friendsList.all():
            Budget.objects.filter(user=friend.user).update(budgetofUser=F('budgetofUser') - instance.amount)

相关问题