Django查询未输出正确的结果

时间:2019-12-30 08:42:03

标签: django django-models

我有一个名为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分享该帖子时具有正确的时间。

逻辑应该是按降序显示用户的帖子和他们共享的帖子。我该如何实施?

1 个答案:

答案 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')