【问题标题】:DRY Django querysetsDRY Django 查询集
【发布时间】:2016-06-06 14:04:16
【问题描述】:

我有一个查询,用户 order_by 对数据库中的多个聚合字段进行了查询,如下所示:

list = MyList.objects.filter(key_item=None).extra(
        select={"diff":"abs(field1+field2+field3+field4+field5+field6+field7+field8+field9+field10)"}).order_by('-diff')

我在代码中的几个地方都使用了它,我宁愿把它放在某个集中的地方。

我想知道在 django 中重用它的最佳方式。

【问题讨论】:

  • A list 本质上是 iterable,您的意思是“将其作为可迭代列表访问”。 ?

标签: python django


【解决方案1】:

您可以将管理器添加到模型类中,以将其作为基本过滤器包含在内。 例如:

class MyListManager(models.Manager):
    def select_diff(self):
        return self.get_queryset().extra(...)


class MyList(models.Model):
    objects = MyListManager()

有了这个,你可以简单地做到:

MyList.objects.select_diff().filter(...)

你可以找到更多关于经理here

与将查询集写在某处相比,这样做的一大优势是您仍然可以将查询集与其他过滤器/参数链接起来,并且符合 django 标准

【讨论】:

  • 感谢您为我指明正确的方向。我尝试了快速实现,但收到错误'function' object has no attribute 'filter'。我需要添加一些东西才能使过滤器属性起作用吗?
  • 看起来你正在做 select_diff.filter() 而不是 select_diff().filter() ?该错误表明您没有调用其中一个函数,因此您试图访问它的过滤器属性(不存在)
猜你喜欢
  • 2012-11-22
  • 2020-10-26
  • 2017-01-12
  • 2012-04-26
  • 2013-12-06
  • 2021-07-25
  • 2011-05-16
  • 2021-10-22
  • 1970-01-01
相关资源
最近更新 更多