Skip to content Skip to sidebar Skip to footer

How To Exclude Non-active Users From Queryset In Django

I want to exclude non-active users from my project. example 1: url:users/1/friends/ will show all friends of that user. I want to show only active users in friend list. example

Solution 1:

You should use a custom Model Manager:

classActiveUsersManager(models.Manager):
    use_for_related_fields = Truedefget_queryset(self):
        returnsuper(ActiveUserManager, self).get_queryset().filter(is_active=True)


classUser(models.Model):
    is_active = models.BooleanField(default=true)

    # first manager is the default and accessible through objects.
    active = ActiveUsersManager()
    all_users = models.Manager()

active_users = User.objects.all()    
all_users = User.all_users.all()

Solution 2:

If you want to exclude non-active users from a queryset you can use the following filter:

YourModel.objects.exclude(friend__is_active=False)

# or 
YourModel.objects.filter(friend__is_active=True)

Where friend is a ForeignKeyField to a User model object in YourModel.

If you want a more general solution, you can use a ModelManager:

classActiveUsersOnlyManager(models.Manager):
    defget_queryset(self):
        returnsuper(ActiveUsersOnlyManager, self).get_queryset().filter(is_active=True)


classUser(models.Model):
    is_active = models.BooleanField(default=true)
    friends = models.ForeignKey(User)
    # first manager is the default and accessible through objects.
    objects = ActiveUsersManager()

Solution 3:

You can use Creating a manager with QuerySet methods

can be used to create an instance of Manager with a copy of a custom QuerySet’s methods

classUserQuerySet(models.QuerySet):
    def active(self):
        return self.filter(is_active=True)

classUser(models.Model):
    is_active = models.BooleanField(default=true)

    objects = UserQuerySet.as_manager()

And use it simply like this

User.objects.active()

For custom users (AbstractUser) you need this solution It is based on this answer

from django.db.models import QuerySet
from django.contrib.auth.models import AbstractUser, UserManager


classUserQuerySetManager(UserManager):
    def__getattr__(self, attr, *args):
        try:
            returngetattr(self.__class__, attr, *args)
        except AttributeError:
            # don't delegate internal methods to the querysetif attr.startswith('__') and attr.endswith('__'):
                raisereturngetattr(self.get_query_set(), attr, *args)

    defget_query_set(self):
        return self.model.QuerySet(self.model, using=self._db)


classUser(AbstractUser):
    objects = UserQuerySetManager()


    classMeta:
        permissions = (
            ('view_all_managers', 'View All Managers'),
        )

    classQuerySet(QuerySet):
        defactive(self):
            return self.filter(is_active=True)

Post a Comment for "How To Exclude Non-active Users From Queryset In Django"