【问题标题】:Django error when following relationships backward向后跟踪关系时出现 Django 错误
【发布时间】:2013-10-14 16:41:29
【问题描述】:

我有两个模型:

Base_Activity:

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

用户活动:

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

现在我想查询 Base_activity 以选择所有带有 topic X 的行,并为 user=*current_user 排除 User_Activity 中具有匹配行的任何行* 和 is_archived=True


我已阅读 Django 文档,了解如何使用 follow relationships backward,因为我查询了 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,那我做错了什么?

【问题讨论】:

    标签: django orm


    【解决方案1】:
    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)
    

    【讨论】:

    • 嗨 raacer,这正是我所希望的答案。 user_activity_set.all() 现在可以工作了,但是正如您所指出的,我应该像您在更新中的行一样进行查询。谢谢。
    【解决方案2】:

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

    【讨论】:

    • 嗨,raacer,你能解释一下为什么这是个坏主意吗?
    • 仅仅因为遵循编码约定让生活更轻松:)
    • PEP 8 说:“几乎无一例外,类名都使用 CapWords 约定。内部使用的类还有一个前导下划线。”点击此链接了解更多信息python.org/dev/peps/pep-0008
    猜你喜欢
    • 1970-01-01
    • 2012-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多