Django 在保存时更新 m2m 对象

问题描述 投票:0回答:1

我有一个 m-2-m rel,并且 我想在通过管理页面添加任何 rel A 后更新 rel B

详情如下:

我有 2 个模型,比赛(rel A)和玩家(rel B)。我想在每次添加与 Match.team1 或 Match.team2 中的该玩家的新比赛时更新 Player.matches_played 。

我怎样才能做到这一点???

型号

class Match(models.Model):
    data=models.DateField(auto_now_add=False,auto_now=False)
    team1=models.ManyToManyField('players.Player',related_name='team_1')
    team2=models.ManyToManyField('players.Player',related_name='team_2')
    score_team1=models.IntegerField(validators=[MinValueValidator(0)])
    score_team2=models.IntegerField(validators=[MinValueValidator(0)])

class Player(models.Model):
    matches_played= models.IntegerField(validators=[MinValueValidator(0)], default=0)

我尝试了信号,但在post_save signal {instance.team1} 或instance.team1.all() 返回一个空的QuerySet,我相信这是正确的,因为M2M rel 稍后保存。 然后我尝试了m2m_changed,但是通过管理页面保存该信号没有被触发。我错过了什么?


@receiver(post_save, sender=Match, dispatch_uid="update_player_game_count")
def update_player_games(sender, instance, created, **kwargs):
    print(f'created {instance.pk}')
    print(f'created {instance.team1}')
    print(f'created {instance.team2}')
    print(f'created {instance.score_team1}')
    print(instance.team1.all())
@receiver(m2m_changed, sender=Match, dispatch_uid="update_player_game_count")
def update_player_game(sender, instance, created, action, **kwargs):
    print(action)
    if action == 'post_add':
        print(action)

非常感谢您的帮助

我想到的另一种选择是通过 Player 中的属性检索数据,例如像这样,但是我认为,从性能角度来看,最好在每次添加匹配时更新行然后在每次请求玩家时计算匹配数

示例

@property def matches_played(self): return Match.objects.filter(team1__nome=self.nome).count()+Match.objects.filter(team2__nome=self.nome).count()
    
django django-models django-signals django-related-manager
1个回答
0
投票

m2m_change

信号的发送者[Django-doc]不是Match
,而是
Match.team1.through
和/或
Match.team2.through
,所以:

@receiver( m2m_changed, sender=Match.team1.through, dispatch_uid='update_player_game_count1', ) @receiver( m2m_changed, sender=Match.team1.through, dispatch_uid='update_player_game_count2', ) def update_player_game(sender, instance, created, action, **kwargs): print(action) if action == 'post_add': print(action)
    
© www.soinside.com 2019 - 2024. All rights reserved.