【问题标题】:Django query not outputting correct resultDjango查询没有输出正确的结果
【发布时间】:2020-04-19 00:39:34
【问题描述】:

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

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

【问题讨论】:

    标签: django django-models


    【解决方案1】:

    您可以创建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')
    

    【讨论】:

      猜你喜欢
      • 2019-07-07
      • 1970-01-01
      • 1970-01-01
      • 2018-02-10
      • 1970-01-01
      • 1970-01-01
      • 2020-12-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多