相关疑难解决方法(0)

Django左外连接

我有一个网站,用户可以在其中查看电影列表,并为他们创建评论.

用户应该能够看到所有电影的列表.此外,如果他们审查了电影,他们应该能够看到他们给出的分数.如果没有,则仅显示没有得分的电影.

他们根本不关心其他用户提供的分数.

考虑以下 models.py

from django.contrib.auth.models import User
from django.db import models


class Topic(models.Model):
    name = models.TextField()

    def __str__(self):
        return self.name


class Record(models.Model):
    user = models.ForeignKey(User)
    topic = models.ForeignKey(Topic)
    value = models.TextField()

    class Meta:
        unique_together = ("user", "topic")
Run Code Online (Sandbox Code Playgroud)

我本质上想要的是这个

select * from bar_topic
left join (select topic_id as tid, value from bar_record where user_id = 1)
on tid = bar_topic.id
Run Code Online (Sandbox Code Playgroud)

考虑以下内容test.py:

from django.test import TestCase

from bar.models import *


from django.db.models import Q

class TestSuite(TestCase):

    def setUp(self): …
Run Code Online (Sandbox Code Playgroud)

python django orm django-models

23
推荐指数
6
解决办法
1万
查看次数

姜戈 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
查看次数