小编psl*_*sln的帖子

姜戈 ORM。加入子查询

我有一个表格,其中包含一些网站的列表和一个包含它们的统计信息的表格。

class Site(models.Model):
    domain_name = models.CharField(
        max_length=256,
        unique=True,
    )


class Stats(models.Model):
    date = models.DateField()
    site = models.ForeignKey('Site')
    google_pr = models.PositiveIntegerField()

    class Meta:
        unique_together = ('site', 'date')
Run Code Online (Sandbox Code Playgroud)

我想查看具体日期的所有站点和统计数据。如果该日期的统计记录不存在,则选择必须仅包含站点。

如果我使用:

Site.objects.filter(stats__date=my_date)
Run Code Online (Sandbox Code Playgroud)

我不会得到它没有记录网站my_datestats表格。因为在这种情况下,SQL 查询将如下所示:

SELECT *
FROM site
LEFT OUTER JOIN stats ON site.id = stats.site_id
WHERE stats.date = 'my_date'
Run Code Online (Sandbox Code Playgroud)

查询条件将排除日期为 NULL 的记录,没有统计信息的站点将不包括在选择中。

在我的情况下,我需要加入已按日期过滤的统计表:

SELECT *
FROM site
LEFT OUTER JOIN
  (SELECT *
   FROM stats
   WHERE stats.date = 'my-date') AS stats
ON site.id = stats.site_id
Run Code Online (Sandbox Code Playgroud)

如何将此查询转换为 Django ORM?

谢谢。

django join left-join django-orm django-managers

9
推荐指数
3
解决办法
9546
查看次数

标签 统计

django ×1

django-managers ×1

django-orm ×1

join ×1

left-join ×1