Как получить первую запись отношения 1-N из основной таблицы с помощью Django ORM?

У меня есть таблица Users, которая является FK к таблице Post. Как я могу получить только последний пост, который зарегистрировал пользователь? Замысел состоит в том, чтобы вернуть список пользователей с последним зарегистрированным постом, но при получении пользователей, если у пользователя 3 поста, то он повторяется 3 раза. Я заинтересован в том, чтобы пользователь был только один раз. Есть ли альтернатива, которая не является уникальной?


class User(models.Model):
    name = models.CharField(max_length=50)

class Post(models.Model):
    title = models.CharField(max_length=50)
    user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='posts', related_query_name='posts')
    created = models.DateTimeField(default=timezone.now)

    class Meta:
        get_latest_by = 'created'
        ordering = ['-created']`

Я уже пробовал с selected_related и prefetch_related, я продолжаю получать множественные регистрации пользователей, когда у них есть несколько сообщений.

user = User.objects.select_related('posts').all().values_list('id', 'name', 'posts__title', 'posts__created')

Это дает мне нужный ответ, но когда я изменяю созданное поле на сортировку по дате, я не получаю самую новую запись, я всегда получаю самую старую.

user = User.objects.select_related('posts').all().values_list('id', 'name', 'posts__title', 'posts__created').distinct('id')

Я пытаюсь сделать это, не прибегая к перебору записей и получению последнего сообщения. Я знаю, что это альтернатива, но я пытаюсь найти способ сделать это непосредственно с помощью Django ORM, поскольку есть тысячи записей и for менее чем оптимален.

В этом случае ваш запрос Django ORM сначала отфильтрует сообщения по пользователю, затем упорядочит по созданные в порядке убывания и получит первый элемент набора запросов.

last_user_post = Post.objects.filter(user__id=1).order_by('-created').first()

В качестве альтернативы можно использовать экземпляр пользователя:

user = User.objects.get(id=1)
last_user_post = Post.objects.filter(user=user).order_by('-created').first()
Вернуться на верх