我有一个配置文件模型,它引用了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模型以我想要的相同顺序给出用户名,但是用户模型不维护该顺序。如何使其保持与配置文件返回的顺序相同。
答案 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>
这是未经测试但我希望它有所帮助!