Django模型order_by基于另一个模型queryset长度
Django model order_by based on another model queryset length
我有 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 的点赞数来订购 Post
。 post 的点赞数是 PostLike
个拥有 _type="LIKE",content=post_object
个对象的数量。
我怎样才能根据点赞数专门订购Post
?
您可以用 Count 个相关的 Post 对象来注释每个 Post,这可以有一个过滤器来只计算满足条件的相关对象。然后按注解排序
from django.db.models import Count, Q
Post.objects.annotate(
likes=Count('postlike', filter=Q(postlike___type="LIKE"))
).order_by('-likes')
我不确定有一个带下划线前缀的字段是最好的主意,它可能会弄乱 ORM 和 Django 内部的其他部分
这会将您的过滤器限制为 Post 并使用 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 个模型:
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 的点赞数来订购 Post
。 post 的点赞数是 PostLike
个拥有 _type="LIKE",content=post_object
个对象的数量。
我怎样才能根据点赞数专门订购Post
?
您可以用 Count 个相关的 Post 对象来注释每个 Post,这可以有一个过滤器来只计算满足条件的相关对象。然后按注解排序
from django.db.models import Count, Q
Post.objects.annotate(
likes=Count('postlike', filter=Q(postlike___type="LIKE"))
).order_by('-likes')
我不确定有一个带下划线前缀的字段是最好的主意,它可能会弄乱 ORM 和 Django 内部的其他部分
这会将您的过滤器限制为 Post 并使用 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]