我有两种模式:
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,那么我做错了什么?
答案 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)