如何根据具有外键关系的另一个模型更新 Django 模型的字段

Posted

技术标签:

【中文标题】如何根据具有外键关系的另一个模型更新 Django 模型的字段【英文标题】:How to Update field of Django model based on another model with foreign key relation 【发布时间】:2021-10-11 19:52:19 【问题描述】:

我有两个模型 Betslip 和 Bet,我想将 Betslip.settled_status 的值更新为'Lost',如果 Bet.settlement_status 是'half_lost'或'lost',任何人都可以为它创建一个方法吗?

class Betslip(models.Model):
    SETTLED_STATUS_CHOICE = (
        ('InGame','InGame'),
        ('Won','Won'),
        ('Lost','Lost'),
        ('Refunded','Refunded')
    )
    settled_status = models.CharField(choices=SETTLED_STATUS_CHOICE,max_length=30)


class Bet(models.Model):
    SETTLEMENT_STATUS_CHOICE = (
        ('','select'),
        ('won','won'),
        ('lost','lost'),
        ('refund','Refund'),
        ('half_won','half_won'),
        ('half_lost','half_lost'),
    )

  
    settlement_status = models.CharField(choices=SETTLEMENT_STATUS_CHOICE,max_length=30,)
    betslip = models.ForeignKey(Betslip,on_delete=models.CASCADE,related_name='bet')```

【问题讨论】:

您尝试了哪些方法,哪些方法不起作用? 尝试阅读django signals 我尝试覆盖保存方法,但找不到正确的逻辑来保存我在 betslip.settlement_status 中的值 【参考方案1】:

你可以从this discussion了解@property 为了使用 bets 对象获取投注的结算状态属性,您可以在 Betlip 属性中使用“反向相关对象查找”又名 _set(因为您在 Bet 中使用了 Betslip 的外键)

【讨论】:

【参考方案2】:

你可以这样做:

Bet 模型中试试这个:

def update_settled_status(self):
    if self.settlement_status in ['lost','half_won']:
        self.betslip.settled_status = 'Lost'
        self.betslip.save()

【讨论】:

我没有收到任何错误,但它也没有改变 betslip.settled_status 的值,我也运行了迁移.. 我不知道你想在哪里使用它。你可以像这样调用这个方法: bet = Bet.objects.get(pk=_a_bet_pk) bet.update_settled_status() 它会在方法声明中用 'self.betslip.save()' 保存值。 我需要重写Betslip的save方法来在数据库中保存新值,如何在Betslip的save中调用这个函数? 您可以在 Betslip 保存方法中执行此操作:self.bet.first().update_settled_status()

以上是关于如何根据具有外键关系的另一个模型更新 Django 模型的字段的主要内容,如果未能解决你的问题,请参考以下文章

根据同一模型中的另一个外键动态限制 Django 模型中外键的​​选择

使用与默认用户模型具有外键关系的 Django 模型

具有外键和多对多关系的 Django 模型与同一模型

如何在Django中查询具有特定数量的外键关系并且在这些外键值中具有特定值的对象?

Django - 显示结果信息,同时使用具有多个外键关系的模型优化数据库查询

django模型在具有外键的字段中没有列错误