在django中使用过滤器遍历m2m

时间:2013-02-08 21:58:52

标签: python django many-to-many django-views

我正在尝试从m2m关系返回过滤值以在模板中使用。应该是微不足道的,但我无法让它发挥作用。

我尝试在here描述的模型中执行此操作并且无法使其工作。现在我在视图中尝试了一种可能更简单的方法,描述为here,但无法使其工作。

class Activity(models.Model):
    activity_nm = models.CharField(max_length=60)  
    enddt = models.DateField()
    groups =  models.ManyToManyField(Group)
    def __unicode__(self):
        return self.activity_nm     

class Group (models.Model):
    group_nm = models.CharField(max_length=64)
    def __unicode__(self):
        return self.group_nm        



def group_details_page(request, group_nm):
    g=Activity.objects.filter(groups__in=[Group.objects.filter(group_nm=group_nm)],enddt__gt=now)
    return render_to_response('group_details_page.html', {'group': g},context_instance=RequestContext(request))   

我的目标是返回活动结束日期>的一个组的所有活动。现在可以在模板中使用。

感谢。

编辑:收到的错误是: int()参数必须是字符串或数字,而不是'QuerySet'

EDIT2:看起来这个问题比我想象的要多。我现在无法获得任何价值。

g=Group.objects.all()

不会向模板返回值。该模板解析了base.html调用,但尝试仅显示{{ group.group_nm }}不起作用。

EDIT3:让它返回群组名称(抱歉混淆)。

2 个答案:

答案 0 :(得分:1)

我认为您要做的是从activity_set指定的群组中过滤group_nm(请参阅backward relations):

def group_details_page(request, group_nm):
    group_instance = Group.objects.get(group_nm=group_nm)
    activities = group_instance.activity_set.objects.filter(enddt__gt=now)
    return render_to_response(...etc...)

答案 1 :(得分:0)

经过测试,解决方案非常简单。

使用g=Activity.objects.filter(groups__in=[Group.objects.filter(group_nm=group_nm)],enddt__gt=now),您可以在列表中放置一个可迭代([QuerySet]),django不知道如何编制索引。

解决方案是转储列表理解:

g=Activity.objects.filter(groups__in=Group.objects.filter(group_nm=group_nm),enddt__gt=now)

然后它就像一个魅力。