如何基于外键关联模型属性对Django的Booking模型对象排序?
Django中基于关联字段对Booking模型排序的实现方法
要实现基于关联模型字段对Booking对象排序,Django的QuerySet支持通过双下划线__跨关联模型访问字段,具体实现如下:
1. 基于TimeSlot的available_from字段排序
直接在order_by()方法中使用关联字段路径timeslot__available_from:
# 正序排序(按可用开始时间从早到晚) bookings = Booking.objects.all().order_by('timeslot__available_from') # 倒序排序(按可用开始时间从晚到早) bookings = Booking.objects.all().order_by('-timeslot__available_from')
如果希望Booking模型默认按该字段排序,可修改模型的Meta类:
class Booking(models.Model): customer = models.ForeignKey(User, on_delete=models.CASCADE) check_in_date = models.DateField() timeslot = models.ForeignKey(TimeSlot, on_delete=models.CASCADE) class Meta: ordering = ['timeslot__available_from'] # 默认正序 # 若需默认倒序,改为:ordering = ['-timeslot__available_from']
2. 基于Room的number字段排序
Booking与Room通过TimeSlot间接关联,需使用完整的关联路径timeslot__room__number:
# 正序排序(按房间号从小到大) bookings = Booking.objects.all().order_by('timeslot__room__number') # 倒序排序(按房间号从大到小) bookings = Booking.objects.all().order_by('-timeslot__room__number')
设置默认排序的话,同样修改Booking的Meta类:
class Booking(models.Model): # 原有字段定义... class Meta: ordering = ['timeslot__room__number'] # 默认按房间号正序
多字段组合排序
如果需要同时按多个关联字段排序(比如先按房间号,再按时间段),只需在order_by()中依次列出字段路径:
bookings = Booking.objects.all().order_by('timeslot__room__number', 'timeslot__available_from')
内容的提问来源于stack exchange,提问作者Anshul Gupta
相关产品推荐
相关产品推荐

