Связанное поле Django .order_by() возвращает слишком много элементов
Я пытаюсь вернуть список пользователей, которые недавно опубликовали сообщение, но метод order_by заставляет его возвращать слишком много элементов.
всего 2 счета, но когда я звоню
test = Account.objects.all().order_by('-posts__timestamp')
[print(i) for i in test]
он вернет автора каждого экземпляра поста и его дубликатов. А не только два экземпляра аккаунта.
test@test.gmail.com
test@test.gmail.com
test@test.gmail.com
test@test.gmail.com
foo@bar.example
Есть помощь?
class Account(AbstractBaseUser):
...
class Posts(models.Model):
author = models.ForeignKey('accounts.Account',on_delete=models.RESTRICT, related_name="posts")
timestamp = models.DateTimeField(auto_now_add=True)
title = ...
content = ...
Это абсолютно нормально. Вы должны понять, как формируется SQL-запрос. Ваш должен выглядеть примерно так:
select *
from accounts
left join post on post.account_id = account.id
order by post.timestamp
Вы эффективно выбираете каждое сообщение с его связанными пользователями. Это нормально, что у вас есть несколько дублирующихся пользователей.
Что вы можете сделать, так это убедиться, что вы выбираете разных пользователей: Account.objects.order_by('-posts__timestamp').distinct('pk')
Что бы я сделал, так это кэширование этой информации в аккаунте (непосредственно в модели аккаунта или в другой модели, которая имеет связь 1 к 1 с вашими пользователями.
Добавление last_post_date
к вашей модели аккаунта позволит вам иметь менее тяжелый запрос.
Обновление Account.last_post_date
при каждом создании Post
может быть немного утомительным, но вы можете абстрагироваться от этого, используя сигналы модели django.