9

いくつかの Web サイトのリストを含むテーブルと、それらの統計を含むテーブルがあります。

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')

特定の日付のすべてのサイトと統計を表示したい. 日付の統計レコードが存在しない場合、選択にはサイトのみが含まれている必要があります。

私が使用する場合:

Site.objects.filter(stats__date=my_date)

テーブルmy_dateにレコードがないサイトは取得できません。statsこの場合、SQL クエリは次のようになります。

SELECT *
FROM site
LEFT OUTER JOIN stats ON site.id = stats.site_id
WHERE stats.date = 'my_date'

クエリ条件は、NULL 日付のレコードを除外し、統計のないサイトは選択に含まれません。

私の場合、すでに日付でフィルタリングされている統計テーブルに参加する必要があります。

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

このクエリを Django ORM に変換するにはどうすればよいですか?

ありがとう。

4

3 に答える 3