向后跟踪关系时的 Django 错误



我有两个模型:

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 的所有行,并排除具有 user=*current_user* 和 is_archived=True User_Activity匹配行的任何行。


我已经阅读了关于如何向后跟踪关系的 Django 文档,因为我查询了Base_Activity,但需要来自具有前者外键User_Activity的信息。但是,即使在 Django 控制台中测试此方法也不起作用:

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

问题:查询的最佳方式是什么?如果这确实是反向跟随外键,那么我做错了什么?

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)

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

相关内容

最新更新