【问题标题】:Ordenate django query by user按用户排列 django 查询
【发布时间】:2017-09-06 04:09:52
【问题描述】:

我正在尝试检索某些用户创建并在我的 API 中显示的对象,但我需要由该用户对这些对象进行排序。如果使用 order_by('created_by') 查询集将按用户 id 排列(不一定是我想要的 id,而是降序排列),第一个结果必须是我的用户创建的 Opportunity,然后是其他结果。

我认为这可以解决,但 q 失去了联合的祝福:

def get_queryset(self):
    user = self.request.user
    q_all = Opportunity.objects.all().exclude(created_by=user.id)
    q_user = Opportunity.objects.filter(created_by=user.id).exclude(archived=True)
    q = q_user | q_all
    return q

【问题讨论】:

  • 您想按用户名订购?
  • 可以是名称或 id,我只是想先显示用户的机会,而不是查询集中的其他人。

标签: django django-rest-framework django-queryset


【解决方案1】:

您可以使用sorted 带键的方法对QuerySet 进行排序。

解决方案

def sort_by_auth_user(self, item):
    if item.created_by == self.request.user:
        return -1
    else:
        return 1

def get_queryset(self):
    opp_qs = Opportunity.objects.all()
    sorted_opp_qs = sorted(opp_qs, key=self.sort_by_auth_user)
    return sorted_opp_qs

sorted 方法接受一个列表和一个可选参数key,您可以在其中传递一个方法来根据您自己的自定义需求进行排序。

我使用该自定义方法检查item.created_by 是否是经过身份验证的用户,为此我返回了-1,它可以是任何小于其他非由经过身份验证的用户创建的项目的值的值。

【讨论】:

  • 谢谢,这正是我需要的
猜你喜欢
  • 2012-07-30
  • 2021-06-01
  • 1970-01-01
  • 2023-04-03
  • 1970-01-01
  • 1970-01-01
  • 2020-08-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多