如何在django中从queryset中排除非活动用户

时间:2014-05-19 12:00:16

标签: django python-2.7 django-rest-framework

我想从我的项目中排除非活跃用户。

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)

3 个答案:

答案 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)

其中friendForeignKeyField中的UserYourModel模型对象。

如果您想要更通用的解决方案,可以使用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)