在Django中使用过滤器遍历多对多关系
我正在尝试从一个多对多的关系中返回过滤后的值,以便在模板中使用。这应该很简单,但我就是搞不定。
我试着按照这里描述的方法在模型中实现,但没成功。现在我在尝试一种可能更简单的方法,在视图中实现,具体描述在这里,但这也没能成功。
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'
编辑2:看起来这个问题比我想的要复杂。我现在无法返回任何值。
g=Group.objects.all()
没有返回值到模板。模板能够解析 base.html 的调用,但尝试让 {{ group.group_nm }}
显示出来也不行。
编辑3:终于让它返回组名了(抱歉让大家困惑了)。
2 个回答
1
我觉得你想做的是从指定的 group_nm
组中筛选出 activity_set
(可以查看 反向关系):
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...)
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)
这样就能顺利运行了。