【问题标题】:Most practical and efficient way to filter objects in Django?在 Django 中过滤对象的最实用和最有效的方法?
【发布时间】:2018-04-20 14:26:31
【问题描述】:

Django 中过滤对象的最佳方法是什么?

就我而言,我需要通过GET request 发送的不同参数过滤对象。因此,在我的get_querysetCBV 中,我将值发送到我的自定义models.QuerySet 的自定义函数并检索结果:

return MyModel.objects.all().custom_filter(param1, param2, param3)

但在我的自定义函数中,最令人怀疑的事情发生了。

  1. 首先,我检查传递的值是否存在并清理它们。
  2. 然后,对于每个参数,我分别使用Q Objects 过滤查询集。在自定义 models.QuerySet 中,它看起来像:

    def custom_filter(self, param1, param2, param3):
        # cleaning and checking staff
        # ... then
        result = self.filter(Q() | Q()) # related to param1
        if (param2 != None):
            result = result.filter(Q()) # related to param2
        if (param3 != None):
            result = result.filter(Q() & Q()) # related to param3
        # and etc.
        return result.distinct()
    

这在那个时候工作得很好。但我认为这绝对是低效。如果有人有更好的解决方案,请提供。

【问题讨论】:

    标签: python django filtering django-queryset


    【解决方案1】:

    不要思考 - 衡量。查询需要多长时间?您可以在部署它之前在生产风格区域中对其进行测试吗?

    您可以通过查看任何查询集上的.query 来查看发送到数据库的查询。通过以这种方式查看真实查询,您将更好地了解您的查询是否可怕。

    print unicode(MyModel.objects.all().custom_filter(param1, param2, param3).query)
    

    如果您想要更高级的细分,通常我会将它们放入数据库中的 EXPLAIN ANALYSE 中。这将使您全面了解您的数据库使用什么魔法来实际收集您的结果。您需要查看您的数据库文档以获取有关此方法的更多信息,因为它会有所不同。

    最后 - 但也许是最重要的 - querysets only evaluate when they have to。在您提供的示例中,根本不会进行任何数据库查询。你认为这绝对是低效的——但我看不出你为什么会这样想的任何理由。

    【讨论】:

    • 我是 Django 的新手。真不知道QuerySets 很懒。
    • 它有很大的不同:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-07
    • 1970-01-01
    • 1970-01-01
    • 2020-12-07
    • 1970-01-01
    • 2017-05-19
    • 1970-01-01
    相关资源
    最近更新 更多