Ошибка рекурсии при изменении поля ManyToManyField во время сохранения модели Django

У меня возникла проблема с удалением пользователей из поля friends при сохранении в Django.

Вот описание моей идеи:

У каждого профиля есть type, который соответствует определенному рангу. Например, у профиля с рангом type X может быть 10 друзей, а у профиля с типом Y - 20 друзей.

Вот как я это реализовал:

POWER_OF_PROFILE_TYPE = {"X": 0, "Y": 1}

class ProfileType(models.TextChoices):
    X = "X", "x"
    Y = "Y", "y"

class Profile(models.Model):
    type = models.TextField(choices=ProfileType.choices, default=ProfileType.BASIC, max_length=1)
    friends = models.ManyToManyField(User, blank=True, related_name="friends")
    __currently_type = None

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.__currently_type = self.type_of_profile

    def save(self, *args, **kwargs) -> None:
        if self.type_of_profile != self.__currently_type:
            if POWER_OF_PROFILE_TYPE[self.type_of_profile] < POWER_OF_PROFILE_TYPE[self.__currently_type]:
                users = self.friends.all()[10:]
                self.friends.remove(*users)
                self.save()  # This is causing recursion error

        super().save(*args, **kwargs)
        self.__currently_type = self.type_of_profile


К сожалению, этот кусок кода приводит к ошибке рекурсии RecursionError ...maximum recursion depth exceeded. Кто-нибудь может помочь мне понять, что я должен делать?

Не нужно вызывать .save() после вызова .remove() на поля M2M.

Удалите строку, вызывающую ошибку, и все будет в порядке.

Вернуться на верх