我有m-2-m相对值和i want to update the rel B after any rel A is added via the admin page.
Here the details:
我有2个型号,Match(rel A)和Player(rel B).我想更新Player.matches_played,每次在Match.team1或Match.team2中添加与该球员的新比赛.
How can i achieve this???
模型
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)
I tried signals,但在post_save signal {instance.team1}或instance.team1.all()中返回an empty QuerySet,我认为这是正确的,因为M2M rel稍后会保存. 然后我try 了m2m_changed,但信号为is not fired,并通过管理页面保存.我错过了什么?
@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)
非常感谢您的帮助
我想到的是an alternative是通过Player中的属性检索数据,例如这样,but我认为,from a performance point of view,最好在每次添加匹配时更新行,然后在每次请求玩家时计算匹配数
例如
@property
def matches_played(self):
return Match.objects.filter(team1__nome=self.nome).count()+Match.objects.filter(team2__nome=self.nome).count()