【问题标题】:how to exclude non-active users from queryset in django如何从 django 的查询集中排除非活动用户
【发布时间】:2014-07-07 09:07:52
【问题描述】:

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

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.

如果 id 为 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)

【问题讨论】:

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


    【解决方案1】:

    您应该使用自定义模型管理器:

    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()
    

    【讨论】:

    • 谢谢...但我正在开发 django rest 框架,当 rest 框架创建表单以发布请求时,它会自动显示 ForeignkeyField 的所有条目。意味着经理当时不工作。
    • 如果我做对了,use_for_related_fields = true 应该可以解决这个问题。
    【解决方案2】:

    如果您想从查询集中排除非活动用户,您可以使用以下过滤器:

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

    其中friendForeignKeyFieldYourModel 中的User 模型对象。

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

    【讨论】:

    • 我知道 ....我想要一个通用的解决方案,这样我就不需要像你上面所说的那样在任何地方过滤查询集。
    • 谢谢...但我正在开发 django rest 框架,当 rest 框架创建表单以发布请求时,它会自动显示 ForeignkeyField 的所有条目。意味着经理当时不工作。
    【解决方案3】:

    您可以使用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)
    

    【讨论】:

      猜你喜欢
      • 2010-12-22
      • 2013-01-27
      • 2018-01-04
      • 1970-01-01
      • 1970-01-01
      • 2013-04-08
      • 1970-01-01
      • 2014-04-11
      • 1970-01-01
      相关资源
      最近更新 更多