Ваш дизайн модели мне не подходит. На данный момент вы можете поместить любой экземпляр Account
как user
или other_user
, и, поскольку они оба ссылаются на одну и ту же модель (Account
), при выполнении любого извлечения из базы данных вам необходимо учитывать обаfields.
Лучшим дизайном IMO было бы использовать ManyToManyField
(отношение «многие ко многим») в модели Account
для себя, так как одна учетная запись может иметь несколько других учетных записей в качестве друзей и вице. наоборот. Итак:
class Account(models.Model):
...
friends = models.ManyToManyField('self')
...
Теперь вы можете добавлять друзей, например:
account_foo.friends.add(account_bar, account_spam)
account_*
Account
экземпляров.
Вы можете получить всех друзейaccount_foo
как:
account_foo.friends.all()
Проверьте документ «многие ко многим» для различных примеров интеграции данных и запросов.
Теперь, чтобынайдите общих друзей, например, account_foo
и account_bar
, вы можете сначала найти всех друзей account_foo
, а затем посмотреть, кто из них также дружит с account_bar
:
friends_with_foo = account_foo.friends.values_list('pk', flat=True)
mutual_friends_of_foo_bar = account_bar.friends.filter(pk__in=friends_with_foo)