revsys
django-friendship
Python

Django app to manage following and bi-directional friendships

Last updated Jun 24, 2026
764
Stars
176
Forks
8
Issues
0
Stars/day
Attention Score
35
Language breakdown
Python 88.1%
HTML 9.1%
Makefile 2.0%
Just 0.8%
โ–ธ Files click to expand
README

django-friendship

CI

This application enables you to create and manage follows, blocks and bi-directional friendships between users. It features:

  • Friendship request objects that can be accepted, rejected, canceled, or marked as viewed.
  • Hooks to easily list all friend requests sent or received by a given user, filtered by the status of the request.
  • A blocklist for each user of users they've blocked.
  • Tags to include information about friendships, blocks and follows in your templates.
  • Integration with AUTHUSERMODEL.
  • Validation to prevent common mistakes.
  • Faster server response time through caching

Requirements

Django 4.2, 5.1, and 5.2 + Python 3.9, 3.10, 3.11, 3.12, and 3.13 support added >v1.9.6

Previously:

  • Django 3.2 since v1.9.1
  • Django 1.11+ since v1.7.0 (latest release supporting Django 1.10 is v1.6.0)

Installation

  • pip install django-friendship
  • add "friendship" to INSTALLED_APPS and run python manage.py migrate.
  • Use the friendship manager in your own views, or wire up the URLconf to include the builtin views:
urlpatterns = [
    # other paths
    path("friendship/", include("friendship.urls"))
]

Note: If you are migrating from django-friendship v1.6.x, you'll need to rollback your migrations and fake migration 0002

$ ./manage.py migrate friendship 0001
$ ./manage.py migrate friendship 0002 --fake

If you're migrating from v1.7.x, you'll likely have to fake 0003 as well:

$ ./manage.py migrate friendship 0003 --fake

Usage

django-friendship provides a free API that gives you several ways to create and manage friendship requests or follows in your views. Add the following at the top of your views.py:

from django.contrib.auth.models import User
from friendship.models import Friend, Follow, Block

Getting Data about Friendships

  • List all of a user's friends: Friend.objects.friends(request.user)
  • List all unread friendship requests: Friend.objects.unread_requests(user=request.user)
  • List all unrejected friendship requests: Friend.objects.unrejected_requests(user=request.user)
  • Count of all unrejected friendship requests: Friend.objects.unrejectedrequestcount(user=request.user)
  • List all rejected friendship requests: Friend.objects.rejected_requests(user=request.user)
  • Count of all rejected friendship requests: Friend.objects.rejectedrequestcount(user=request.user)
  • List of all sent friendship requests: Friend.objects.sent_requests(user=request.user)
  • Test if two users are friends: Friend.objects.arefriends(request.user, otheruser) == True

Getting Data about Follows

  • List of a user's followers: Follow.objects.followers(request.user)
  • List of who a user is following: Follow.objects.following(request.user)

Getting Data about Blocks

  • List of a user's blockers: Block.objects.blocked(request.user)
  • List of who a user is blocking: Block.objects.blocking(request.user)
  • Test if a user is blocked: Block.objects.isblocked(request.user, otheruser) == True

Managing Friendships and Follows

Create a friendship request:

other_user = User.objects.get(pk=1)
Friend.objects.add_friend(
    request.user,  # The sender
    other_user,  # The recipient
    message="Hi! I would like to add you",
)  # This message is optional

Let the user who received the request respond:

from friendship.models import FriendshipRequest

friend_request = FriendshipRequest.objects.get( fromuser=request.user, touser=other_user ) friend_request.accept()

or friend_request.reject()

To remove the friendship relationship between request.user and other_user, do the following:

Friend.objects.removefriend(request.user, otheruser)

Make request.user a follower of other_user:

Follow.objects.addfollower(request.user, otheruser)

Make request.user block other_user:

Block.objects.addblock(request.user, otheruser)

Make request.user unblock other_user:

Block.objects.removeblock(request.user, otheruser)

Templates

You can use django-friendship tags in your templates. First enter:

{% load friendshiptags %}

Then use any of the following:

{% friends request.user %}
{% followers request.user %}
{% following request.user %}
{% friend_requests request.user %}
{% blockers request.user %}
{% blocking request.user %}

Signals

django-friendship emits the following signals:

  • friendshiprequestcreated
  • friendshiprequestrejected
  • friendshiprequestcanceled
  • friendshiprequestaccepted
  • friendship_removed
  • follower_created
  • following_created
  • follower_removed
  • following_removed
  • block_created
  • block_removed

Settings

django-friendship supports the following settings:

FRIENDSHIPCONTEXTOBJECT_NAME = "user"
FRIENDSHIPCONTEXTOBJECTLISTNAME = "users"
FRIENDSHIPMANAGERFRIENDSHIPREQUESTSELECTRELATEDSTRATEGY = (
    "selectrelated"  # ('selectrelated', 'prefetch_related', 'none')
)

Contributing

Development takes place on GitHub. Bug reports, patches, and fixes are always welcome!

Need help?

REVSYS can help with your Python, Django, and infrastructure projects. If you have a question about this project, please open a GitHub issue. If you love us and want to keep track of our goings-on, here's where you can find us online:

ยฉ 2026 GitRepoTrend ยท revsys/django-friendship ยท Updated daily from GitHub