我有一个名为Post
的模型和另一个名为Share
的模型,用户可以创建帖子或共享帖子。我正在使用以下查询:
Post.objects.filter(
Q(user=user) |
Q(share__user=user)
).annotate(
shared_or_created=Coalesce('share__shared_at', 'created_at')
).order_by('-shared_or_created')
通过该查询,我得到了正确的帖子,但是,假设另一个用户(用户B)共享了该用户的帖子,那么shared_at
字段将是用户B分享该帖子的时间。因此,如果用户有3个帖子,并且1个用户共享了该用户的帖子,则其中两个帖子在创建该帖子时将具有正确的时间,而第三个帖子将在用户B分享该帖子时具有正确的时间。
逻辑应该是按降序显示用户的帖子和他们共享的帖子。我该如何实施?
答案 0 :(得分:0)
您可以创建一个conditional annotation来根据条件对值进行注释
from django.db import models
from django.db.models import Case, When, F
Post.objects.filter(
Q(user=user) |
Q(share__user=user)
).annotate(
shared_or_created=Case(
When(user=user, then=F('created_at')),
When(share__user=user, then=F('share__shared_at')),
output_field=models.DateTimeField()
)
).order_by('-shared_or_created')