我有两个模型:
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 中的类名中使用下划线。