使用Django queryset按多对一字段中的值排序?

2024-04-26 13:27:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我有这样一个数据模型:

class Post(models.Model)
    name = models.CharField(max_length=255)

class Tag(models.Model)
    name = models.CharField(max_length=255)
    rating = models.FloatField(max_length=255)
    parent = models.ForeignKey(Post, related_name="tags")

我想得到有标签的帖子,并按标签评级排序。在

比如: Posts.objects.filter(tags_uname=“exampletag”)。order_by(“tags(name=exampletag)u rating”)

目前,我认为做一些类似的事情是有意义的

^{pr2}$

但我想知道是否有更好的方法,最好是查询Post,并返回一个queryset。在


编辑:

我不认为这是:(编辑2-这个没有给出正确的排序!

Posts.objects.filter(tags__name="exampletag").order_by("tags__rating")

将给出正确的排序,因为它不仅按名为“exampletag”的相关项进行排序
需要类似以下内容

Posts.objects.filter(tags__name="exampletag").order_by("tags(name=exampletag)__rating")

我已经看过了django文档,它似乎“annotate”几乎是起作用了,但我看不出一种方法可以使用它来按名称选择标记。在


编辑2

两个答案都是正确的!请看我的评论来观察一些史诗般的大脑放屁(一个测试,结果井然有序,另一个我根据不同的标签过滤和排序!)在

工作原理

质询

Posts.objects.filter(tags__name="exampletag").order_by("tags__rating")

以及

Posts.objects.filter(tags__name="exampletag").filter(tags__name="someothertag").order_by("tags__rating")

将正常工作,并按“exampletag”分级排序

调用order_by时用于排序的标记(来自ForeignKey BackReference集)似乎是first过滤器中的标记。在


Tags: namebyobjects排序modelstagsorder标签
2条回答

甚至比Anush还短,使用连接而不是子查询:

Post.objects.filter(tags__name='exampletag').order_by('tags__rating')

你可以这样做:

tags = Tags.objects.filter(name="sometagname")
posts =  Post.objects.filter(tags__in=tags).order_by('tags__rating')

相关问题 更多 >