Я нашел два способа реализации системы симметричной дружбы (ты мой друг, поэтому я тоже твой друг) в Django:
Как указано в документации:
class UserProfile(models.Model):
friends = models.ManyToManyField(User, related_name='friends')
Теперь я хотел бы получить все "дружественные" модели пользователей и пользовательских профилей с одним запросом select_related, например, так (это должен быть поиск с обратным объединением):
profiles = UserProfile.objects.filter(user__in=request.user.get_profile().friends.all()).select_related()
Я запрашиваю userprofile, потому что таким образом я могу использовать select_related () и все связанные объекты кэшируются.
С другой стороны, я могу определить свою модель, ссылаясь на поле друзей на «себя», например:
class UserProfile(models.Model):
friends = models.ManyToManyField('self')
Теперь мой поиск по выбранному другу выглядит так:
profiles = this_user.get_profile().friends.all().select_related()
Мне всегда нужны и пользовательский объект, и связанный с ним профиль: второй подход намного проще в отношении обратного просмотра с помощью select_related (), но делает практически то же самое. Тем не менее, используя «я» в качестве ссылки на поле, Джанго обрабатывает для меня симметричную дружбу. Таким образом, мне не нужно создавать две записи для каждой дружбы в базе данных вручную. Джанго делает это для меня. Симметричный параметр, однако, работает только с «само» ссылочными полями.
Какое решение лучше? Я ничего не могу найти по этому поводу. Любые идеи приветствуются - спасибо!