首页 > 解决方案 > Django查询没有输出正确的结果

问题描述

我有一个名为的模型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 共享该帖子的时间。

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

标签: djangodjango-models

解决方案


您可以创建条件注释以根据条件注释值

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

推荐阅读