向后关注关系时出现Django错误

时间:2013-10-14 16:41:30

标签: django orm

我有两种模式:

Base_Activity:

topics = models.ManyToManyField(Topic)
... some others

User_Activity:

user = models.ForeignKey(settings.AUTH_USER_MODEL)
activity = models.ForeignKey(Base_Activity)
is_archived = models.BooleanField(default=False)

现在,我想查询Base_activity以选择主题X 的所有行,并排除{strong}用户User_Activity中具有匹配行的所有行> = * current_user *和 is_archived = True


我已经阅读了关于如何follow relationships backward的Django文档,因为我查询Base_Activity,但需要来自User_Activity的信息,其中包含对前者的ForeignKey。但是,即使在Django控制台中测试此方法也不起作用:

a = Base_Activity.objects.filter(topics__slug = topic)
a.user_activity_set.all()
AttributeError: 'InheritanceQuerySet' object has no attribute 'user_activity_set'

问题:查询的最佳方式是什么?如果这确实是通过向后关注ForeignKey,那么我做错了什么?

2 个答案:

答案 0 :(得分:0)

  

我做错了什么?

我不确定这会解决您的问题,但无论如何请不要在Python的类名中使用下划线

答案 1 :(得分:0)

a = Base_Activity.objects.filter(topics__slug = topic)

这将返回QuerySet实例,而不是模型实例。您应该遍历它或从列表中获取一个:

activities = Base_Activity.objects.filter(topics__slug=topic)
activities[0].user_activity_set.all()

在您的情况下,您可以在一个查询中完成整个工作:

activities = Base_Activity.objects.filter(topics__slug=topic).exclude(user_activity__user=user, user_activity__is_archived=True)