【发布时间】:2019-04-28 04:17:36
【问题描述】:
如果我在管理器中添加过滤器,对数据库的 sql 查询将太长,因为我的过滤器将在 sql-query 的开头。
在应用所有其他过滤器和更改后,我需要在最后运行此过滤器。
当前查询集:
links = Link.objects.all().filter_deleted()
links = links.filter(linkname='linkname', left_uuid__in=all_uuids)
links = links.filter(left_type='type')
links = links.values_list('left_uuid', 'right_uuid', 'right_type')
编译完queruset后的SQL查询:
SELECT "baseobj_link"."left_uuid", "baseobj_link"."right_uuid", "baseobj_link"."right_type_id"
FROM "baseobj_link"
WHERE (
"baseobj_link"."id" IN (
SELECT DISTINCT ON (U0."linkname", U0."left_uuid", U0."right_uuid") U0."id" AS Col1
FROM "baseobj_link" U0
WHERE U0."config_id" IN (2848)
ORDER BY U0."linkname" ASC, U0."left_uuid" ASC, U0."right_uuid" ASC, U0."domain_level" ASC, U0."config_id" DESC, U0."is_deleted" DESC
) AND
"baseobj_link"."is_deleted" = false AND
"baseobj_link"."linkname" = 'linkname' AND
"baseobj_link"."left_uuid" IN (
SELECT V0."uuid" AS Col1
FROM "structure_cgw" V0
WHERE (
V0."id" IN (
SELECT DISTINCT ON (U0."uuid") U0."id" AS Col1
FROM "structure_cgw" U0
WHERE U0."config_id" IN (2848)
ORDER BY U0."uuid" ASC, U0."domain_level" DESC, U0."config_id" DESC
) AND
V0."is_deleted" = false
)
) AND
"baseobj_link"."left_type_id" = 6
);
args=(2848, False, 'linkname', 2848, False, 6)
filter_deleted()生成的部分:
"baseobj_link"."id" IN (
SELECT DISTINCT ON (U0."linkname", U0."left_uuid", U0."right_uuid") U0."id" AS Col1
FROM "baseobj_link" U0
WHERE U0."config_id" IN (2848)
ORDER BY U0."linkname" ASC, U0."left_uuid" ASC, U0."right_uuid" ASC, U0."domain_level" ASC, U0."config_id" DESC, U0."is_deleted" DESC
)
需要将此代码添加到此模型的所有查询的末尾,因此这不是一项简单的任务。
如何最有效地解决这个问题?
【问题讨论】:
-
您好,请详细说明您的问题并添加一些您想要实现的代码
标签: django database orm django-queryset