【问题标题】:Django filter on prefetch related queryset预取相关查询集上的 Django 过滤器
【发布时间】:2020-08-28 05:14:17
【问题描述】:

我正在使用 Django 2.2

我有许多与 User 模型反向相关的模型,我想使用不同的过滤器从每个模型中获取计数。

例如,我有一个类似Relations 的模型

status = (
  ('Active', 'active')
  ('Inactive', 'inactive')
)

class Relation(models.Model):
  user = models.ForeignKey(User, related_name='relation')
  status = models.CharField(choices=status, default=ACTIVE)

现在我想为用户分别获取每个状态的计数和查询集。为此,我在 User 模型中定义了模型方法

def get_relation():
  return self.relation.all()

def get_active_relation(self):
  return self.relation().filter(status='active')

def get_inactive_relation():
  return self.relation().filter(status='inactive')

def get_active_count():
  return self.get_active_relation().count()

def get_inactive_count():
  return self.get_inactive_relaiton().count()

我有用户对象

user = User.objects.prefetch_related(
  'relation'
).get(pk=request.user.pk)

现在当我得到计数​​时,它会为此执行一个额外的查询

user.get_active_count()

如何过滤prefetch_related 对象?

我发现在另一个 SOF 答案中使用 lambda 从 prefetch_related 中获取 max 值:https://stackoverflow.com/a/12609454/3719167

是否也可以使用lambda 来过滤查询集?

【问题讨论】:

    标签: django django-models django-queryset


    【解决方案1】:

    您是否尝试过过滤关系的属性?

    user = User.objects.prefetch_related(
        'relation'
    ).filter(
        relation__status='active'
    ).get(pk=request.user.pk)
    

    【讨论】:

      【解决方案2】:

      根据documentation,您无法过滤已缓存的对象。但是,您可以在使用Prefetch 获取对象时将它们过滤掉。它也在 django 3.1 中工作。例如:

      from django.db.models import Prefetch
      
      user = User.objects.get(pk=request.user.pk).prefetch_related(
        Prefetch('relation', queryset=Relation.objects.filter(status='active'))
      )
      

      【讨论】:

        猜你喜欢
        • 2012-05-15
        • 2018-09-22
        • 2019-07-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-12-03
        • 1970-01-01
        • 2015-05-02
        相关资源
        最近更新 更多