在Django中使用过滤器遍历多对多关系

0 投票
2 回答
577 浏览
提问于 2025-04-17 15:17

我正在尝试从一个多对多的关系中返回过滤后的值,以便在模板中使用。这应该很简单,但我就是搞不定。

我试着按照这里描述的方法在模型中实现,但没成功。现在我在尝试一种可能更简单的方法,在视图中实现,具体描述在这里,但这也没能成功。

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)

这样就能顺利运行了。

撰写回答