Связанное поле 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.

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