Как получить первую запись отношения 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()