当前位置:  开发笔记 > 编程语言 > 正文

Python Django:加入同一个表

如何解决《PythonDjango:加入同一个表》经验,为你挑选了0个好方法。

我正在尝试ltree在PostgreSQL中使用扩展来构建全文地址搜索引擎.

我的模型看起来像这样(它略微简化):

from django.db import models


class Addresses(models.Model):
    name = models.CharField(max_length=255)
    path = models.CharField(max_length=255)

因此,此表中的数据将如下所示:

id  |   name       |  path
----------------------------
 1  |  USA         | 1
 2  |  California  | 1.2
 3  |  Los Angeles | 1.2.3

我想对每个实体的聚合名称进行全文搜索.基本上我需要将表中的每一行转换为下一个格式来进行搜索:

    id  |           full_name            |  path
-------------------------------------------------
  1     |  USA                           |   1
  2     |  California USA                |   1.2
  3     |  Los Angeles California USA    |   1.2.3

我这样做,所以用户可以执行像'los ang cali'或类似的查询.使用原始 PostgreSQL查询我没有问题:

SELECT *, ts_rank_cd(to_tsvector('english', full_address), query) AS rank 
FROM (SELECT s.id, s.path, array_to_string(array_agg(a.name ORDER BY a.path DESC), ' ') AS full_address
        FROM "Addresses" AS s INNER JOIN "Addresses" AS a
        ON (a.path @> s.path) GROUP BY s.id, s.path, s.name
) AS subquery, to_tsquery('english', %s) as query WHERE   to_tsvector('english', full_address) @@ query
ORDER BY rank DESC;

这工作正常,但在使用RawQuerySet,我不能用之类的东西.filter(),.group_by(),分页等.

在Django中重现它的主要限制是这个JOIN:

JOIN "Addresses" AS a ON (a.path @> s.path)

它是用来连接各元素的所有祖先,然后用它们聚集array_agg(),array_to_string功能,因此这些功能的输出可进一步使用全文搜索.

如果有人有更好的想法如何使用Django ORM实现这种事情,请指教.

推荐阅读
LEEstarmmmmm
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有