在 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的主要内容,如果未能解决你的问题,请参考以下文章