具有隐式连接的表的Django查询

时间:2018-03-17 03:40:06

标签: django

我已阅读文档并查看了此处发布的其他问题,但我无法找到或弄清楚这是否可以在Django中使用。

我有一个关于演员和电影的模型:

class Role(models.Model):
    title_id = models.CharField('Title ID', max_length=20, db_index=True)
    name_id = models.CharField('Name ID', max_length=20, db_index=True)
    role = models.CharField('Role', max_length=300, default='?')

这是一个包含演员和电影对的单个表,所以给定一部电影(title_id),该电影中的每个演员都有一行。类似地,给定一个actor(name_id),演员所在的每部电影都有一行。

我需要执行一个查询,以返回由公共actor与给定title_id相关的所有title_id的列表。此查询的SQL如下所示:

SELECT DISTINCT r2.title_id 
    FROM role as r1, role as r2 
    WHERE r1.name_id = r2.name_id 
        AND r1.title_id != r2.title_id 
        AND r1.title_id = <given title_id>

这样的事情可以在单个Django ORM查询中表达,还是我被迫使用两个查询和一些干预代码? (或原始SQL?)

1 个答案:

答案 0 :(得分:1)

通常情况下,我会将其分解为Actor和Movie表格,以便于查询,但您的要求就在那里,所以我会试一试

def get_related_titles(title_id)
    all_actors = Role.objects.filter(title_id=title_id).values_list('pk', flat=True)
    return Role.objects.filter(pk__in=all_actors).exclude(title_id=title_id) # maybe u need .distinct() here

这应该给你一个查询,以这种方式验证:

print(get_related_titles(some_title_id).query)