如何执行从 RAW SQL 到 Django 查询集的转换

How to perform translation from RAW SQL to django queryset

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

有简单型号:

酿酒师 - 目标型号

葡萄酒

Post

酿酒师有 1 种以上的葡萄酒

葡萄酒有 1+ Posts

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

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;

您应该能够在注释函数中使用 Count aggregation 表达式来完成此操作。我猜测了你关系字段的 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,具体取决于您是否正在交换关系。