首页 > 解决方案 > 如何执行从 RAW SQL 到 django 查询集的翻译

问题描述

我正在努力转换为具有原始 sql 的 django 查询我是 django 的新手,任何帮助将不胜感激

有简单的模型:

酿酒师 - 目标模型

葡萄酒

邮政

酿酒师有 1+ 葡萄酒

葡萄酒有 1+ 个帖子

我知道它应该用注释来完成,但不知道如何实现它。

select w2.*,
       (select count(wp.id)
        from web_winemaker www
                 inner join web_wine ww on www.id = ww.winemaker_id
                 inner join web_post wp on ww.id = wp.wine_id
           where
                ww.status=20
            and
                 wp.status=20
            and
                 www.id = w2.id
       ) as wineposts_count,
       (
           select count(w.id)
           from web_winemaker www1
           inner join web_wine w on www1.id = w.winemaker_id
           where
                w.status=20
           and www1.id = w2.id
        ) as wines_count
from web_winemaker w2;

标签: sqldjangodjango-queryset

解决方案


您应该能够使用 annotate 函数中的Count 聚合表达式来完成此操作。我猜测了你related_name在关系字段中的值,所以下面的代码可能不会直接插入,但应该让你知道如何做你想做的事。

from django.db.models import Count, Q

wine_makers = Winemaker.objects.annotate(
    posts_count=Count(
        'wine__post__id',
        filter=Q(wines__status=20, wines__posts__status=20),
    ),
    wines_count=Count(
        'wines__id',
        filter=Q(wines__status=20),
    ),
)

您可能需要distinct=True根据您是否跨越关系来提供。


推荐阅读