Друзья Django как поле многие ко многим - лучше хранить User или UserProfile (self) в поле? - PullRequest
6 голосов
/ 25 октября 2011

Я нашел два способа реализации системы симметричной дружбы (ты мой друг, поэтому я тоже твой друг) в 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 (), но делает практически то же самое. Тем не менее, используя «я» в качестве ссылки на поле, Джанго обрабатывает для меня симметричную дружбу. Таким образом, мне не нужно создавать две записи для каждой дружбы в базе данных вручную. Джанго делает это для меня. Симметричный параметр, однако, работает только с «само» ссылочными полями.

Какое решение лучше? Я ничего не могу найти по этому поводу. Любые идеи приветствуются - спасибо!

1 Ответ

3 голосов
/ 25 октября 2011

Simon,

Иногда лучше использовать существующий плагин, чем пытаться заново изобрести колесо.

Вы уже посмотрели django-friends

...