У меня есть эта модель:
class People(models.Model):
name = models.CharField(max_length=128, db_index=True)
friends = models.ManyToManyField('self')
Итак, friends
отношение симметричное .Так что, если ты мой друг, я твой друг.
Я бы тоже хотел, чтобы все друзья моего друга автоматически стали моими друзьями.Пример:
Если A и B являются друзьями (AB, BA) и мы добавляем нового друга C в B, C будет автоматически добавляться также в A (AB, BA, BC, CB, AC, CA),Если мы удалим C из B, C будет автоматически удален из A.
Мне нужно, чтобы это работало на обычной странице администратора.При отправке формы для ManyToManyField Django сначала вызывает clean()
, стирая все отношения, связанные с текущим экземпляром, затем add()
, добавляя все отношения, поступающие из формы.
Мне удалось получитьхорошее поведение при добавлении нового отношения с этим кодом (но оно не работает при удалении отношения):
def add_friends(sender, instance, action, reverse, model, pk_set, **kwargs):
if action == 'post_add':
if len(pk_set) > 1:
pk = pk_set.pop()
next = People.objects.get(pk=pk)
next.friends.add(*pk_set)
m2m_changed.connect(add_friends, sender=People.friends.through)
При поиске решений мне трудно не создавать бесконечный цикл.