Tự động tính giá trị của một field dựa vào giá trị của các field khác

04:45 24/05/2021gale1 trả lời29 lượt xem

Mình có model như sau

class Match(models.Model):
    ...
    home_team = models.ForeignKey(Team, on_delete=models.CASCADE)
    away_team = models.ForeignKey(Team, on_delete=models.CASCADE)
    goal_diff = models.SmallIntegerField(default=0)
    ...

class Team(models.Model):
    ...
    goals = models.PositiveSmallIntegerField(default=0)
    ...

mình muốn giá trị của

Match.goal_diff = Match.home_team.goals - Match.away_team.goals
thì làm như thế nào ạ
Mình cảm ơn !!
Gửi Trả Lời

1 trả lời cho câu hỏi

  1. Bạn có thể sử dụng signal để giải quyết vấn đề này

    Document tại đây

    Trường hợp trên bạn dùng signal post_save cho model Team

    from django.db.models.signals import post_save
    from django.dispatch import receiver
    from your_app.models import Team, Match
    
    
    @receiver(post_save, sender=Team)
    def update_goal_diff_signal(sender, team, **kwargs):
        try:
            match = Match.object.get(home_team__id = team.id)  # get match instance
            match.goal_diff = match.home_team.goals - match.away_team.goals
            match.save(update_fields=["goal_diff"]))
        except Match.DoesNotExists:
            pass
    
        # Làm tương tự với away_team
    
    Đã chỉnh sửa lúc 05:21 24/05/2021