将SQL请求转换为Django ORM请求

时间:2014-07-22 10:11:11

标签: sql django-models

我在django中有一个简单的模型

from django.conf import settings
from django.db import models


class Message(models.Model):
    message_num = models.IntegerField()
    owner = models.ForeignKey(settings.AUTH_USER_MODEL)
    name = models.CharField(max_length=50)
    creation_time = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return ''.join([
            str(self.id),
            ' ',
            str(self.message_num),
            ' ',
            self.name
        ])


class MessageVersion(models.Model):
    message_id = models.ForeignKey(Message)
    version_num = models.PositiveIntegerField()
    text = models.TextField()
    creation_time = models.DateTimeField(auto_now_add=True)

我想为Message选择最新的MessageVersion。在纯SQL中它很简单

select res1.*, res2.* from homepage_messageversion res1
join (
    select message_id_id, max(version_num) as version_num
    from homepage_messageversion
    group by message_id_id
) res2
on (res1.message_id_id = res2.message_id_id)
and (res1.version_num = res2.version_num);

如何纠正将此SQL请求转发给Django ORM请求?

1 个答案:

答案 0 :(得分:1)

Django ORM也很简单。你可以这样做。

首先获取您想要最新VersionMessage的Message对象。例如,我将获取id 1的消息对象。

message = Message.objects.get(id=1)

现在获取上述消息的所有消息版本,并按创建时间排序。

message_versions = MessageVersion.objects.filter(message_id=message).order_by('-created')

现在您拥有所有消息版本,现在获得最新版本

message_version_latest = message_versions[0]

希望得到这个帮助。