2010-10-15 87 views
1

我有一个简单的基于through类的多对多关系。Django ManyRelatedManager基于through类的过滤

class Person(models.Model): 
    friends = models.ManyToManyField('self', through='Friendship') 

class Friendship(models.Model): 
    me = models.ForeignKey(Person) 
    them = models.ForeignKey(Person) 
    confirmed = models.BooleanField(default=False) 

这应该的,总之,让别人加别人为好友,但链接不存在,直到对方证实了这一点。够简单。

我想添加一个is_friend(self, user)方法到Person。在我想要做的事,如:

is_friend(self, user): 
    return self.friends.filter(them=user, confirmed=True).count() 

filter似乎只在遥远的类操作(在这种情况下Person)。有没有什么办法可以在Friendship上过滤,而仍然使用ManyRelatedManager

回答

2

我有点生疏,但你试过return Friendship.objects.filter(me=self, them=user, confirmed=True)

+0

我,是的,这工作...我只是希望提供一个“穿越”类来给我一些快捷方式或数据库的储蓄。我在其他地方的其他查询比这更复杂,需要一个可查询的快捷方式来阻止它们变成可怕的多重嵌套查询。 – Oli 2010-10-15 16:22:26

+0

如果您在查询集中使用select_related()来检索人员,那么您可以保存许多数据库查询,因此在检索其朋友时不会再次访问数据库 – Arjan 2011-08-08 13:58:21

1

你试过:

is_friend(self, user): 
    return self.friends.filter(friendship__them=user, friendship__confirmed=True).count()