Django ORM 按过滤器排序

问题描述 投票:0回答:3

请帮助我解决我的问题。我想要先按一个过滤器排序对象,然后再按另一个过滤器排序。

如何在对数据库的 1 次查询中获取具有此排序的对象(需要分页)?

此示例显示没有排序的查询集:

rooms = Room.objects.filter(Q(name__icontains=search) | Q(owner__username__icontains=search))

我有房间模型:

模型.py

from django.db import models
from django.contrib.auth.models import User

class Room(models.Model):
    name = models.CharField(max_length=150)
    owner = models.ForeignKey(User, on_delete=models.CASCADE)

views.py(我的错误代码)

class RoomListView(ListAPIView):
    def get_queryset(self):
        search = 'test' #  for example
        rooms1 = Room.objects.filter(owner__username__icontains=search)
        rooms2 = Room.objects.filter(name__icontains=search)
        return list(rooms1) + list(rooms2)

错误结果:搜索=“测试”

[
  {
    "id":1,
    "name":"test",
    "owner":{
      "username":"user1"
    }
  },
  {
    "id":2,
    "name":"room1",
    "owner":{
      "username":"test"
    }
  },
  {
    "id":3,
    "name":"test2",
    "owner":{
      "username":"user2"
    }
  }
]

正确结果: search = "test"

[
  {
    "id":2,
    "name":"room1",
    "owner":{
      "username":"test"
    }
  },
  {
    "id":1,
    "name":"test",
    "owner":{
      "username":"user1"
    }
  },
  {
    "id":3,
    "name":"test2",
    "owner":{
      "username":"user2"
    }
  }
]

如何在对数据库的 1 次查询中获取具有此排序的对象(需要分页)?

django django-models django-views django-orm django-database
3个回答
2
投票

据我了解,您想要过滤和排序具有多列的行

用于
single
列排序

rooms = Room.objects.filter(Q(name__icontains=search) | Q(owner__username__icontains=search)).order_by('name')

对于
multi
列排序

在这里,我们可以使用

owner_username
对列进行排序,相同的 owner_username 行将使用
name

进行 order_by
rooms = Room.objects.filter(Q(name__icontains=search) | Q(owner__username__icontains=search)).order_by('owner__username', 'name')

注意

  • 您可以使用
    order_by()
  • 对列进行排序
  • 示例
    # Sorting order will in the order of column_1, column_2, column_3
    Room.objects.filter(.....).order_by('column_1', 'column_2', 'column_3)
    
  • 您可以根据需要更改列的顺序

0
投票
  • 您可以使用

    order_by()

    对列进行排序
  • 示例

    # Sorting columns with id, name, username in dynamically 
    order_by_list = []
    # sort by name
    order_by_list.append('name')
    # And second username sort along with name
    order_by_list.append('owner__username')
    
    Room.objects.filter(.....).order_by(*order_by_list)
    
  • 在这里,我们可以将

    append
    动态命名为
    column
    
    


0
投票

© www.soinside.com 2019 - 2024. All rights reserved.