我想从我的项目中排除非活跃用户。
example 1:
url:users/1/friends/ will show all friends of that user.
我想只在好友列表中显示活跃用户。
example 2:
url:users/1/friends/ will show all friends of that user.
如果身份1的用户不活跃,我不想展示他的任何活动......就像他的朋友......他的个人资料......等等
example 3:
url:users/1/challenge/ will show all friends of that user in post form.
我不想以表格形式显示非活跃用户。
有没有通用的方法来执行此操作。因为它是一个大项目,我无法在任何地方进行过滤。
表格如下:
class User(models.Model):
......
......
friends = models.ForeignKey(User)
答案 0 :(得分:4)
您应该使用自定义模型管理器:
class ActiveUsersManager(models.Manager):
use_for_related_fields = True
def get_queryset(self):
return super(ActiveUserManager, self).get_queryset().filter(is_active=True)
class User(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()
答案 1 :(得分:1)
如果要从查询集中排除非活动用户,可以使用以下过滤器:
YourModel.objects.exclude(friend__is_active=False)
# or
YourModel.objects.filter(friend__is_active=True)
其中friend
是ForeignKeyField
中的User
到YourModel
模型对象。
如果您想要更通用的解决方案,可以使用ModelManager
:
class ActiveUsersOnlyManager(models.Manager):
def get_queryset(self):
return super(ActiveUsersOnlyManager, self).get_queryset().filter(is_active=True)
class User(models.Model):
is_active = models.BooleanField(default=true)
friends = models.ForeignKey(User)
# first manager is the default and accessible through objects.
objects = ActiveUsersManager()
答案 2 :(得分:0)
您可以使用Creating a manager with QuerySet methods
可用于创建具有自定义QuerySet方法的副本的Manager实例
class UserQuerySet(models.QuerySet):
def active(self):
return self.filter(is_active=True)
class User(models.Model):
is_active = models.BooleanField(default=true)
objects = UserQuerySet.as_manager()
像这样简单地使用它
User.objects.active()
对于自定义用户(AbstractUser
),您需要此解决方案
它基于this answer
from django.db.models import QuerySet
from django.contrib.auth.models import AbstractUser, UserManager
class UserQuerySetManager(UserManager):
def __getattr__(self, attr, *args):
try:
return getattr(self.__class__, attr, *args)
except AttributeError:
# don't delegate internal methods to the queryset
if attr.startswith('__') and attr.endswith('__'):
raise
return getattr(self.get_query_set(), attr, *args)
def get_query_set(self):
return self.model.QuerySet(self.model, using=self._db)
class User(AbstractUser):
objects = UserQuerySetManager()
class Meta:
permissions = (
('view_all_managers', 'View All Managers'),
)
class QuerySet(QuerySet):
def active(self):
return self.filter(is_active=True)