Как использовать post_save и pre_save с одним отправителем с помощью сигналов django
могу ли я использовать post_save и pre_save с одним отправителем в сигналах Django? Я делаю это потому, что в моем модуле есть 2 случая, и оба требуют разных подходов. Вот мой код :
models.py
class Team(models.Model):
name = models.ForeignKey(TeamName,on_delete=models.PROTECT,related_name="team_team_name")
home_strip = models.ForeignKey(TeamStrip,on_delete=models.PROTECT,related_name="team_team_home_strip")
away_strip = models.ForeignKey(TeamStrip,on_delete=models.PROTECT,related_name="team_team_away_strip")
logo = models.ForeignKey(TeamLogo, on_delete=models.PROTECT,related_name="team_team_logo")
region = models.ForeignKey("locations.Region",on_delete=models.PROTECT,related_name="region_teams")
cap = models.ForeignKey("players.PlayerProfile",on_delete=models.PROTECT,related_name="team_team_cap")
players = models.ManyToManyField("players.PlayerProfile",null=True,blank=True)
average_skill = models.PositiveIntegerField(default=0)
def __str__(self) -> str:
return str(self.name.name) + " - " + str(self.region.name_ar) + "," + str(self.region.name_en)
signals.py
@receiver(pre_save, sender=Team)
def create_Team(sender, instance, **kwargs):
if instance.players.all().count() == 0:
print('normal save')
cap_skills = instance.cap.average_skill
instance.cap.is_cap = True
instance.cap.save()
instance.average_skill = cap_skills
region_object = instance.region
region_object.available_team_names.remove(instance.name)
region_object.available_team_logos.remove(instance.logo)
if region_object.available_team_names.count() == 0 or region_object.available_team_logos.count() == 0:
region_object.can_create_team = False
region_object.save()
else:
region_object.can_create_team = True
region_object.save()
@receiver(post_save, sender=Team)
def udpate_team(sender, instance, **kwargs):
if instance.players.all().count() != 0:
print('m2m changed post_add')
new_players_count = instance.players.all().count() + 1
print("players count:" + str(new_players_count))
new_players_total_skill = 0
print("new_players_total_skill count:" + str(new_players_total_skill))
for player in instance.players.all():
new_players_total_skill += player.average_skill
new_players_total_skill += instance.cap.average_skill
print("new_players_total_skill_after_loop count:" +
str(new_players_total_skill))
new_team_average = round(new_players_total_skill / new_players_count)
print("new_team_average count:" + str(new_team_average))
instance.average_skill = new_team_average
instance.save() #had to use this line to make sure the instance is being saved as it is post_save .. but it causes the pre_save function to be triggered .. and causes an infinite loop
и, как уже упоминалось, это вызывает бесконечный цикл, есть идеи, как достичь тех же потребностей, не попадая в этот цикл?