2015-12-06 16 views
0

我有机型Django的传递闭包产生错误的SQL

class Person(models.Model): 
    # some fields 

class Chat(models.Model): 
    people = models.ManyToManyField(Person) 
    # some fields 

,我想生成所有谁分享一些特定的人至少一个对话的人的查询集。

我试图

Person.objects.get(pk=2).chat_set.values_list('people').distinct() 

但是,这给了我[(2,)]当它应该是[(1,),(2,),(3,)]

我又试图

print(Person.objects.get(pk=2).chat_set 
    .values_list('people').distinct().query) 

这给了我

SELECT DISTINCT "webapp_chat_people"."person_id" FROM 
"webapp_chat" INNER JOIN "webapp_chat_people" ON (
    "webapp_chat"."id" = "webapp_chat_people"."chat_id") 
WHERE "webapp_chat_people"."person_id" = 2 

这显然是错误的!我如何解决它?我宁愿不做任何一种“选择n + 1”。我正在使用1.7.7版本,是否需要升级?

+2

作为一个猜测(我需要睡觉,无法测试),什么是Person.objects.filter(chat__people = Person.objects.get (pk = 2))给? – RemcoGerlich

+0

@RemcoGerlich完全有效。好决定。 – Dan

回答

0

作为一个答案。只需复制@RemcoGerlich评论:

Person.objects.filter(chat__people=Person.objects.get(pk=2))