【问题标题】:Django model order_by based on another model queryset lengthDjango 模型 order_by 基于另一个模型查询集长度
【发布时间】:2021-12-29 23:38:00
【问题描述】:

我有 2 个模型:

models.py

class Post(models.Model):
    title = models.CharField(max_length=255)
    desc = models.CharField(max_length=500)
    content = models.TextField()
    uploadedBy = models.ForeignKey(User, on_delete=models.CASCADE)
    
LIKE_CATEGORIES = (
    ("LIKE", "LIKE"),
    ("DISLIKE", "DISLIKE")
)

class PostLike(models.Model):
    _type = models.CharField(max_length=200, choices=LIKE_CATEGORIES, blank=True, null=True)
    
    content = models.ForeignKey(
        Post, on_delete=models.CASCADE)
        
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    
    created = models.DateTimeField(auto_now_add=True)

我想根据帖子的点赞数订购Post。帖子拥有的点赞数是拥有_type="LIKE",content=post_objectPostLike 对象的数量。

如何根据点赞数专门订购Post

【问题讨论】:

    标签: python python-3.x django django-models django-rest-framework


    【解决方案1】:

    这会将您的过滤器限制为使用 LIKE 发布并对其进行排名

    from django.db.models import Count
    Post.objects.filter(postlike___type='LIKE').annotate(likes=Count('postlike')).order_by('-likes')
    
    Or
    
    from django.db.models import Count
    Post.objects.filter(postlike___type='LIKE').annotate(Count('postlike'))[::-1]
    

    【讨论】:

      【解决方案2】:

      您可以使用相关 PostLike 对象的 Count 注释每个 Post,这可以有一个过滤器来仅计算满足条件的相关对象。然后按注解排序

      from django.db.models import Count, Q
      Post.objects.annotate(
          likes=Count('postlike', filter=Q(postlike___type="LIKE"))
      ).order_by('-likes')
      

      我不确定有一个带下划线前缀的字段是不是最好的主意,它可能会弄乱 ORM 和 Django 内部的其他部分

      【讨论】:

      • 非常感谢您的回答!!!!顺便说一句,我应该将_type 重命名为type,因为type 是python 关键字。我可以吗?还是会引起其他问题?
      • @PranavaMohan type 应该没问题,或者如果你想避免内置,你可以使用category,因为你已经在选择中使用了这个词?
      猜你喜欢
      • 2023-03-17
      • 2021-03-26
      • 2018-04-15
      • 1970-01-01
      • 2016-11-22
      • 2018-12-04
      • 2015-09-26
      • 2012-12-15
      • 2013-12-31
      相关资源
      最近更新 更多