【发布时间】:2019-08-22 03:34:06
【问题描述】:
我有一组模型,其中 Student 通过另一个模型 ClassStudentMapping 分配多个 Classes,该模型有一个字段,我可以在其中设置学生在特定日期上的课程。
models.py
class Student (models.Model):
...
class Class(models.Model):
...
students = models.ManyToManyField(Student, related_name='classes', through="ClassStudentMapping")
class ClassStudentMapping(models.Model):
class = models.ForeignKey(Class)
student = models.ForeignKey(Student)
DAYS_OF_THE_WEEK = [
('0', 'Monday'),
('1', 'Tuesday'),
('2', 'Wednesday'),
('3', 'Thursday'),
('4', 'Friday'),
('5', 'Saturday'),
('6', 'Sunday'),
]
days = ArrayField(models.CharField(max_length=1, choices=DAYS_OF_THE_WEEK), size=20, default=list(range(0,7)))
所以如果this_student 是Student 的一个实例,那么我显然可以通过student.classes.all() 获得一个学生的所有课程。我希望能够使用自定义管理器调用自定义查询以获取学生当天所有课程。
class ClassTodayManager(models.Manager):
def get_queryset(self):
return super().get_queryset().filter(classstudentmapping__days__contains=[str(datetime.today().weekday())])
但我不知道将这个管理器放在哪里,以便我可以通过student.today_classes.all() 之类的方式调用它。
我很天真地按照 Django 文档进行了尝试:
class Class(models.Model):
today_classes = ClassTodayManager()
但这导致,“AttributeError: 'Student' object has no attribute 'today_classes'。
我意识到我需要custom reverse manager,并尝试了student.classes(manager='today_classes')。
但奇怪的是,它返回了每个结果的倍数 - 两个用于只在星期三发生的课程,9 (!) 用于一周中所有 7 天发生的课程——并且它禁用了默认的 Class.objects.all() 调用,我仍然需要能够调用它。
我认为这里有一个与 through 模型相关的复杂情况,我不知道如何解决,这使得我在网上可以找到的所有其他示例都无关紧要。
有什么想法吗?
【问题讨论】:
标签: django django-models django-managers