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"