2010-12-17 90 views
3

答案可能(也可能)已经存在,但我有一个艰难的时间试图找出什么寻找。Django“通过”模型迭代

我有三种模式:人员,组和会员。

class Person(Contact): 
    first_name = models.CharField(_('first name'), max_length=200, blank=True) 
    last_name = models.CharField(_('last name'), max_length=200, blank=True) 

class Organization(Contact): 
    title = models.CharField(_('title'), max_length=200) 
    members = models.ManyToManyField(Person, blank=True, through='Membership') 

class Membership(models.Model): 
    person = models.ForeignKey(Person) 
    organization = models.ForeignKey(Organization) 
    position = models.CharField(max_length=64, blank=True) 

我想获得的人的名单,并很容易获得,一个人属于但是组它不是成员和人之间的1对1的关系。看起来最简单的方法是在Person中创建一个方法get_memberships,它将返回一个人与之关联的成员资格(如果有的话)。这是否有意义,并且以这种方式从模型中获得这种关系还是有一个更好的方法去实现它是一种合理的做法吗?

回答

6

是的。

Person.organization_set.all()应该返回有问题的人所属的组织列表。对于该组中的每一个组织,你可以再回到自己的位置,所以:

p = Person.objects.get(id=personid) 

for o in p.organization_set.all(): 
    # you have o and p, you should be able to find a unique m. 
    m = Membership.objects.get(Person=p, Organization=o) 

参见文档here