2011-04-12 46 views
0

说我有很好的老人/组/隶属关系Django的排序object_list中通过现场

class Person(models.Model): 
    name = models.CharField(max_length=128) 

    def __unicode__(self): 
     return self.name 

class Group(models.Model): 
    name = models.CharField(max_length=128) 
    members = models.ManyToManyField(Person, through='Membership') 

    def __unicode__(self): 
     return self.name 

class Membership(models.Model): 
    person = models.ForeignKey(Person) 
    group = models.ForeignKey(Group) 
    date_joined = models.DateField() 
    invite_reason = models.CharField(max_length=64) 

,我想显示属于一组(以URL指定)的人员名单一般视图按Membership类的date_joined字段排序。我想我可以做一个视图这样

def group_list(request, pagina): 
    return list_detail.object_list(
     request, 
     queryset = Person.objects.filter(group__name = slug), 
     template_object_name = 'person', 
     extra_context = { 'membership' : Membership.objects.all() }, 

     ) 

然后只访问通过membership__date_joined的date_joined模板,但没有运气

回答

1

实际上你想要做的是从Membership对象开始。这是Person和Group特定组合唯一的唯一东西 - 如果您从Person开始,那么访问其成员资格会给您全部,而不是您想要的。所以:

return list_detail.object_list(
    request, 
    queryset = Membership.objects.filter(group__name = slug), 
    template_object_name = 'membership', 
) 
在你的模板

现在:

{% for member in membership %} 
    {{ member.person.name }}: {{ member.date_joined }} 
{% endif %} 
+0

其实我刚刚注意到,这是多了还是相同的解决方案作为阿里的,上面的,除非我说你可以做过滤较少数据库,而不是列表理解。 – 2011-04-12 13:46:59

+0

你说得对。我刚刚意识到我的第二种方法是多么愚蠢,因为在这种情况下,列表理解是完全没有必要的......会员......会员:-) – arie 2011-04-12 14:01:02

+0

FUDGE!我永远花了我的脑袋,即使它是这样简单。我想我现在终于明白了查询集,感谢一百万。 – takosuke 2011-04-13 11:50:04

0

一种选择是直接在中介模式来过滤:

members = [member.person for member in Membership.objects.filter(group__name=slug).order_by('-date_joined')] 

或者只是members = Membership.objects.filter(group__name=slug).order_by('-date_joined')

然后你遍历这个列表中您的模板是这样的:

{% for member in members %} 
    {{ member.person.name }} : {{ member.date_joined }} 
{% endfor %}