【问题标题】:django restframework: how to efficiently search on many to many related fields?django rest 框架:如何有效地搜索多对多相关领域?
【发布时间】:2017-10-18 22:51:04
【问题描述】:

鉴于这些模型:

    class B:

        my_field = TextField()


    class A:
        b = ManyToMany(B)

我在A 中有 +50K 行,在搜索元素时,我想通过遍历b 的多对多字段(即b__my_field)对my_field 进行全文搜索。

当多对多元素 Bper A 对象的数量小于 ~3 时,这可以正常工作。如果我有更好的东西,性能会显着下降。

想知道我是否可以进行某种与预取相关的搜索?像干草堆这样的东西是我唯一的选择吗?

【问题讨论】:

  • 这个查询快吗? B.objects.filter(my_field__contains='search text')
  • 您在 Django 或数据库中是否有性能问题。 django 为一个搜索请求生成多少个查询?

标签: django django-rest-framework django-queryset


【解决方案1】:

当你遍历一个查询集时,django 会为你循环的每一步发出一个数据库请求。有关 ORM 陷阱的示例,请参阅 this。使用 django ORM 时应该学习的一件事是使用命令来尽可能避免数据库往返。一种方法是使用 values() 函数。理想情况下,你也应该只得到你需要的东西。 试试这个:

l = list(A.b.all().values('my_field'))

这保证只有一个数据库查询,并返回一个列表,您可以在 python 速度下循环。应该快得多。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-14
    • 2018-10-15
    • 1970-01-01
    • 2019-07-23
    相关资源
    最近更新 更多