我在用户对象中有一个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';

10-05 22:09