我有一个 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()
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)