Django - 查询 m2m 字段时如何保留添加顺序?

问题描述

我有一个 CustomUser 模型,以及一个通过 m2m 关系引用它的模型:

class CustomUser(AbstractUser):
   ...


class Game(models.Model):
     players = models.ManyToManyField(
        CustomUser,related_name='games',)

当我获取玩家列表时,我希望通过“添加”顺序来接收玩家列表,但是,玩家总是按 CustomUser 表的“id”排序

...即使 CustomUser 在模型级别没有排序 我在 Django 代码中没有看到 AbstractUser

中有任何排序
user1=CustomUser.objects.get(id=1)
user2=CustomUser.objects.get(id=2)
user3=CustomUser.objects.get(id=3)

game=Game.objects.create()

game.players.add(user3)
game.players.add(user1)
game.players.add(user2)

game.players.all()

总是给 user1,user2,user3

如何获取按“添加”顺序(user3,user1,user2)的m2m记录列表?

我想要求通过表中的“id”对查询集进行排序, 但我不知道该怎么做。

有人可以告诉我怎么做吗? ...或向我提出一个可行的解决方案?

提前致谢

解决方法

好吧,在尝试了很多事情之后,我找到了一个令人满意的解决方案,通过在直通表中按 'id' 对查询集进行排序。

可以方便其他人使用,因为似乎没有很多关于使用隐式直通表的可用知识:

class Game(models.Model):
     players = models.ManyToManyField(
        CustomUser,related_name='games',)

     def get_players(self):
         # need to order_by to order by the id of the through table to ensure the players are listed by order of creation in game table.
         # all other way end up to have the records ordered by user_id instead of order of joining the game
       
         return self.players.through.objects.filter(game_id=self.id).order_by('id')

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...