我在用户对象中有一个ManyToManyField,它用于映射用户关注的用户。我正在尝试显示他们最近关注的人的子集列表。 .order_by()中是否有一个技巧可以让我按ManyToManyField的ID进行排序?数据在那里,对吗?
# (people the user is following)
following = models.ManyToManyField(User, related_name="following", blank=True)
theuser.following.filter(user__is_active=True).order_by("user__id")
这将为我提供该用户正在关注但按其加入时的顺序排列的用户列表。我希望以下列表的顺序是用户关注它们时的顺序。
最佳答案
我只是找到了一种无需创建关系类的方法。它依赖于extra
功能,该功能使您可以添加其他列以进行输出。在您的示例中,它看起来像:
theuser.following.filter(user__is_active=True)\
.extra(select={'creation_seq': 'appname_user_user_following.id'})\
.order_by("creation_seq")
注意
appname_user_user_following
是Django在幕后创建的关系表的名称。它是确定性的,您可以通过元机制来获取和设置,但是对它进行硬编码是非常安全的。这是使用伪造的表名和列名在幕后创建的SQL的示例:
SELECT (appname_user_user_following.id) AS `creation_seq`, `appname_user`.`id`
FROM `appname_user` INNER JOIN `appname_user_user_following` ON
(`appname_user`.`id` = `appname_user_user_following`.`user_id`) WHERE
`appname_user_user_following`.`user_followed_id` = 1 ORDER BY `creation_seq` ASC';