Django高级过滤用于一个可以有许多相关外键的Queryset



我正试图在django中对一个可以有多个外键的模型上的查询进行排序。我只想过滤应用于其中一个密钥,我很难让它发挥作用。

型号.py

class Post(models.Model):
content = models.TextField(max_length=1000)
reaction_counts = GenericRelation(ReactionCount, related_query_name='post_reaction_counts')
class ReactionType(models.TextChoices):
LIKE = 'like', ('Like')
DISLIKE = 'dislike', ('Dislike')
STAR = 'star', ('Star')
LOVE = 'love', ('Love')
LAUGH = 'laugh', ('Laugh')
class ReactionCount(models.Model):
count = models.PositiveIntegerField(default=0)
type = models.CharField(
max_length=7,
choices=ReactionType.choices,
)
post = models.ForeignKey(Post, related_name="reaction_count", on_delete=models.CASCADE)

在上面的示例中,键控元素(外键关系(是Post的ReactionCount我想按最喜欢、最讨厌、最喜欢、最多笑的帖子对帖子进行排序。

我正试图通过执行Post.objects.all((.order_by('-reaction_count__type','-reaction-count__count'(来实现这一点

但是,这不起作用,因为每个帖子都有多个ReactionCount对象,导致排序不起作用。

我需要的是一种方法来指定我希望计数的顺序只适用于具有特定类型的ReactionCount外键的帖子。

有没有一种方法可以通过改变对对象Post的排序方式来做到这一点?如果没有,我是否有办法在保留ReactionType选择字段的同时更改我的模型,以便您可以根据特定反应类型的计数进行订购?

顺便说一句,我通过直接查询ReactionCount对象成功地做到了这一点,但如果你删除了特定类型的过滤,那么你会得到重复的帖子结果,因为一篇帖子可以有多个反应类型,因此我相信这个选项不起作用,但我愿意接受建议

我不确定你想要的顺序是什么,所以这里有一些例子
我是你想要最喜欢的帖子

Post.objects.filter(reaction_count__type=ReactionCount.ReactionType.LIKE.value).order_by("-reaction_count__count")

如果你想要反应最多的帖子

Post.objects.alias(reaction_total=Sum("reaction_count__count")).order_by("-reaction_total")

如果你想要有最积极反应的帖子

Post.objects.alias(positive_reactions=Sum("reaction_count__count", filter=Q(reaction_count__type__in=[ReactionCount.ReactionType.LIKE.value, ReactionCount.ReactionType.LOVE.value ...]))).order_by("-positive_reactions")