【问题标题】:django model orm, a relationship query issue, hard to describe itdjango model orm,一个关系查询问题,很难描述
【发布时间】:2015-05-07 04:25:09
【问题描述】:
class Topic(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=16,default='')

class Post(models.Model):
    id = models.AutoField(primary_key=True)
    topic = models.ForeignKey(Topic)
    time = models.DateTimeField(auto_now_add=True)
    name = models.CharField(max_length=16,default='')

现在我想选择所有主题和每个主题的最后一篇文章。

像这样:

1、 topic1     topic1的最后一帖

2、 topic2     topic2的最后一帖

3、话题3     话题3的最后一个帖子

orm查询应该如何构造,而且应该只有一个sql查询字符串。

或者原始的 sql 字符串。

【问题讨论】:

    标签: mysql django orm


    【解决方案1】:

    让它成为Topic 的财产怎么样。像这样:

    @property
    def last_post(self):
        Post.objects.filter(topic=self).annotate(max_time=Max('time')).get(time=F('max_time'))
    

    然后你可以在一个主题上这样做:

    topic = Topic.objects.first()
    topic.last_post
    

    【讨论】:

    • 对于一个主题和主题选择的最后一篇文章,您的建议至少生成 2 个查询 sql 字符串。我想选择许多主题和每个主题的最后一篇文章。在一个 sql 字符串中!
    • 给定一个主题并查询它的最后一篇文章,你的答案可以做到。但我想获取所有主题和每个主题的最后一篇文章
    【解决方案2】:

    原始 sql:

    SELECT * FROM
      (SELECT
      `post`.`topic_id` AS `topic_id`,
      `post`.`id` AS `id`,
      `post`.`time` AS `time`,
      `post`.`name` AS `name`
    FROM `post` ORDER BY `time` DESC) AS `temp`
    inner join `topic` on `topic_id` = `topic`.`id`
    GROUP BY `topic_id`
    ORDER BY `time` DESC;
    

    有没有 orm 表达式可以做到这一点?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-12-02
      • 2011-02-26
      • 2022-11-18
      • 2010-12-29
      • 2017-09-18
      • 2019-04-22
      • 2018-12-01
      • 1970-01-01
      相关资源
      最近更新 更多