Django在外部查询中维护内部查询的顺序?

时间:2017-07-27 16:41:07

标签: python django

我有一个配置文件模型,它引用了Django的默认用户模型。我想要一个增加积分的用户列表。

我的个人资料模型:

class Profile(models.Model):
    username = models.ForeignKey(User, on_delete=None, primary_key=True)
    image = models.CharField(max_length=255, default="")
    points = models.IntegerField(default=0)
    views = models.IntegerField(default=0)

    def __str__(self):
        return self.username.username

我正在解雇此查询:

users = User.objects.filter(username__in=Profile.objects.filter().order_by('-points').values('username__username'))
print(users,Profile.objects.filter().order_by('-points').values_list('username__username'))

我的输出是

<QuerySet [<User: aplha>, <User: baqir>, <User: beta>]> <QuerySet [{'username__username': 'beta'}, {'username__username': 'baqir'}, {'username__username': 'aplha'}]>

现在我们在这里看到,Profile模型以我想要的相同顺序给出用户名,但是用户模型不维护该顺序。如何使其保持与配置文件返回的顺序相同。

2 个答案:

答案 0 :(得分:1)

使用_in时,无法保证结果的顺序。

您可以通过循环浏览配置文件来获取用户列表。如果您使用select_related(),那么您将避免额外的查询来获取每个用户。

profiles = Profile.objects.filter().order_by('-points').select_related('username')
users = [p.username for p in profiles]

请注意,将外部username外键重命名为user可能更好,因为在外键后面会返回User实例,而不是username字符串。

答案 1 :(得分:1)

这个怎么样:

<script src="https://unpkg.com/@reactivex/rxjs@5.0.3/dist/global/Rx.js"></script>

这是未经测试但我希望它有所帮助!