Последние данные Django orm

ссылка

class Board(model.Model):
    master = models.ForeignKey(User, on_delete=models.CASCADE)
    member = models.ForeignKey(User, on_delete=models.CASCADE)
    status = models.PositiveIntegerField(default=0)

class MSG(models.Model):
    Board= models.ForeignKey(Board, on_delete=models.CASCADE)
    writer = models.ForeignKey(User, on_delete=models.CASCADE)
    text = models.TextField()
    created_at = models.DateTimeField(auto_now_add=True, null=True)

Как я могу получить следующие значения из этого отношения?

я использую PostgreSQL

response = {
    master="USER1",
    member="USER2",
    status=0,
    master_latest_MSG="master last_msg"
    master_latest_date="2020.03.21",
    member_latest_MSG="member last_msg"
    member_latest_date="2020.03.22",
}

Есть ли лучший способ вместо подзапроса?

Для составления запроса можно использовать latest и F выражения:

from django.db.models import F

latest_master = (
    MSG
    .objects
    .filter(writer=F('board__master')) #<--- using F
    .latest('created_at')              #<--- using latest 
)

latest_member = (
    MSG
    .objects
    .filter(writer=F('board__member'))
    .latest('created_at')
)

response = {
    master=latest_master.writer.username,
    member=latest_msg.writer.username,
    status=latest_master.Board.status,
    master_latest_MSG=latest_master.text
    master_latest_date=latest_master.created_at,
    member_latest_MSG=latest_member.text
    member_latest_date=latest_member.created_at,
}

Не стесняйтесь форматировать даты так, как вам нужно.

Вернуться на верх