【问题标题】:Challenging django queryset construction具有挑战性的 Django 查询集构建
【发布时间】:2016-01-25 08:39:29
【问题描述】:

我有一个 Django 应用程序,用户在其中登录,设置各种主题,然后将 cmets 留在所述主题下。以下模型反映了这种基本设置:

class Topic(models.Model):
    topic_text = models.TextField()
    submitted_on = models.DateTimeField(auto_now_add=True)

class Comment(models.Model):
    comment_text = models.TextField()
    which_topic = models.ForeignKey(Topic)
    submitted_by = models.ForeignKey(User)
    submitted_on = models.DateTimeField(auto_now_add=True)

对于每个用户,我正在尝试获取 所有主题,其中任何一个 最近的 5 个 cmets 是由用户编写的。换句话说,如果用户在某个主题的最近 5 个 cmets 中没有发表评论,则该主题将被排除在查询集中。

那么我该如何形成这个查询集呢?顺便说一句,我打算向您展示我尝试过的方法,但它非常不充分,而且显然是错误的。有人可以帮忙吗?

【问题讨论】:

  • 我认为尝试选择该用户评论过的主题是没有意义的,并且只有评论在前 5 名之内,尽管使用嵌套查询可能是可能的。相反,我宁愿选择这个用户评论过的主题,然后根据评论在代码中的位置过滤它们(并缓存它,因为它很重)。
  • 我同意。 然后按评论的位置过滤它们部分,我发现几乎不可能绕开我的头。

标签: python django django-queryset


【解决方案1】:

我还没有测试过,但是子查询应该可以工作。像这样的:

Topic.objects.filter(
    comment__submitted_by__in=Comment.objects.values(
        'submitted_by'
    ).order_by(
        '-submitted_on'
    ).limit(5),

    submitted_by=user
)

(如果您打算访问 cmets,请添加 .prefetch_related('comment_set')。)

【讨论】:

  • 当我仔细研究我担心的需求时,我们的建议都不起作用。我会编辑,我们会考虑更多。
  • 您的编辑现在考虑所有 cmets...关键是子查询实际上无法知道如何仅选择与当前主题相关的 cmets
  • 完全正确 :-( 在 Python 中进行第二次过滤可能比做一些更复杂的事情更好。
猜你喜欢
  • 2016-02-17
  • 1970-01-01
  • 2013-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多