我希望从下面显示的模型结构构建一个交叉表视图。 我想要一个矩阵,其中日历的日期在LHS的下方,课程名称在顶部,并且每个单元格中的某些内容表示该日期/课程上存在Booking实例。
简化的模型结构:
class Calendar(models.Model):
crCalDate = models.DateField(primary_key=True)
class Course(models.Model):
ceName = models.CharField()
class CourseBooking(models.Model):
cbCourse = models.ForeignKey(Course,on_delete=models.CASCADE,related_name='booked_course')
cbday = models.ForeignKey(Calendar,related_name='booked_day')
我的视图函数当前的查询集:
class DayView(ListView):
def get_queryset(self):
# construct index of course tuples
course_index = [(cn['id'],'course' + str(i)) for i,cn in enumerate(Course.objects.order_by('id').values('id'))]
coursebookings = CourseBooking.objects.filter(cbday__crCalDate__gte=dt.datetime.today()).values('id','cbday__crCalDate','cbCourse__id','cbCourse__ceName')
calendar_dates = list(Calendar.objects.filter(crCalDate__gte=dt.datetime.today()).order_by('crCalDate').values('crCalDate','crSunrise','crSunset'))
for cb in coursebookings:
for i,cal in enumerate(calendar_dates):
if cal['crCalDate'] == cb['cbday__crCalDate']:
course = [ci[1] for ci in course_index if ci[0] == cb['cbCourse__id']]
if course:
calendar_dates[i][course[0]] = 'Occupied'
break
return calendar_dates
这一切都感觉很繁琐且昂贵,而且我想知道我是在错误地尝试这种方法吗,尝试了annotate()
和aggregate()
函数以实现合适的摘要查询没有成功。
作为奖励,我真的希望能够显示每个日历日每个课程的预定行数,而不是我现在在其中输入的文字。 表示此的附加模型如下:
class BookLine(models.Model):
blTime = models.TimeField(verbose_name='Booking Time')
blDay = models.ForeignKey(CourseBooking,on_delete = models.CASCADE,db_index=True,related_name='bookinglines')
对于实现这一目标的更好方法的任何指导,甚至验证这种方法(除了我上面的奖金要求),都倍受赞赏。