请帮助我解决我的问题。我想要先按一个过滤器排序对象,然后再按另一个过滤器排序。
如何在对数据库的 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 次查询中获取具有此排序的对象(需要分页)?
据我了解,您想要过滤和排序具有多列的行
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)
您可以使用
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