order_by
должно соответствовать distinct()
. В вашем случае вы должны делать это:
posts = Post.objects.filter(public=True) \
.order_by('by') \
.distinct('by')
.distinct([*fields])
работает только в PostgresSQL.
Для MySql Engine. Это MySQL
документация в Django:
Вот разница. Для обычного вызова Different () база данных сравнивает каждое поле в каждой строке, определяя, какие строки различны. Для вызова Different () с указанными именами полей база данных будет сравнивать только указанные имена полей.
Для MySql обходной путь может быть следующим:
from django.db.models import Subquery, OuterRef
user_post = Post.objects.filter(user_id=OuterRef('id')).order_by('posted_on')
post_ids = User.objects.filter(related_posts__isnull=False).annotate(post=Subquery(user_post.values_list('id', flat=True)[:1]))).values_list('post', flat=True)
posts = Post.objects.filter(id__in=post_ids)