在 django 中使用过滤器遍历 m2m

Posted

技术标签:

【中文标题】在 django 中使用过滤器遍历 m2m【英文标题】:traverse m2m with filter in django 【发布时间】:2013-01-24 18:36:07 【问题描述】:

我正在尝试从 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:得到它返回组名(抱歉混淆)。

【问题讨论】:

究竟是什么错误? 这个错误会有所帮助,不是吗。现已添加。 您使用RequestContext 有什么原因吗?如果你不做特别的context preprocessing你就不需要它。 您的模板中需要Group.group_nm 是的,它显示在标题中。 【参考方案1】:

我想你想要做的是从group_nm指定的组中过滤activity_set(见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...)

【讨论】:

我进行了更改,但收到此错误:“ManyRelatedManager”对象没有属性“对象”。这是一种 M2M 关系,而不是 FK。 @jabs 然后尝试直接从经理过滤:group_instance.activity_set.filter(enddt__gt=now) 查询不会返回任何内容。它解决了,因为它带来了 base.html,但没有值。我稍微修改了g=group_instance.activity_set.all() 以消除数据或日期问题,但它仍然没有返回任何值。【参考方案2】:

测试了一下,解决方法很简单。

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

解决方案是转储列表推导:

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

然后它就像一个魅力。

【讨论】:

感谢@RickyA,但我得到相同的 int() ...不是 QuerySet 错误。 谢谢@RickyA,看来我遇到的麻烦比我意识到的要多(见上面的编辑)。 我得到与@mVChr 解决方案相同的结果。将返回 base.html,但没有值。 不要忘记您也在 enddt 上进行过滤。这是我测试您的代码时遇到的问题。 即使删除该过滤器也会得到相同的结果:g=Activity.objects.filter(groups__in=Group.objects.filter(group_nm=group_nm))#,enddt__gt=now) 我还删除了使用上下文处理器来简化事情的分页

以上是关于在 django 中使用过滤器遍历 m2m的主要内容,如果未能解决你的问题,请参考以下文章

在 Django 中过滤第二级多对多关系

通过 m2m 关系的直通表的值过滤 django 查询集

django中具有多个参数的过滤器和链式过滤器之间的区别

django xadmin

Django filter_horizo ntal过滤

Django:遍历模板中的过滤列表