Ошибка рекурсии при изменении поля 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.
Удалите строку, вызывающую ошибку, и все будет в порядке.