次の値とモデルのフィルターソート mixin を作成したいと思います。
class Course(models.Model):
title = models.CharField(max_length=70)
description = models.TextField()
max_students = models.IntegerField()
min_students = models.IntegerField()
is_live = models.BooleanField(default=False)
is_deleted = models.BooleanField(default=False)
teacher = models.ForeignKey(User)
class Session(models.Model):
course = models.ForeignKey(Course)
title = models.CharField(max_length=50)
description = models.TextField(max_length=1000, default='')
date_from = models.DateField()
date_to = models.DateField()
time_from = models.TimeField()
time_to = models.TimeField()
class CourseSignup(models.Model):
course = models.ForeignKey(Course)
student = models.ForeignKey(User)
enrollment_date = models.DateTimeField(auto_now=True)
class TeacherRating(models.Model):
course = models.ForeignKey(Course)
teacher = models.ForeignKey(User)
rated_by = models.ForeignKey(User)
rating = models.IntegerField(default=0)
comment = models.CharField(max_length=300, default='')
- コースは「離散数学 1」である可能性があります
- セッションは、コースに関連する個々のクラスです (例: 1. イントロダクション、2. チャプター I、3 最終試験など) と日付/時刻の組み合わせ
- CourseSignup は学生の「登録」です
- TeacherRating は、教師に対する学生の評価を追跡します (コース完了後)
以下の機能を実装したい
- 日付 (最も早い Session.date_from)、Course.Name で並べ替え (昇順、降順)
- フィルター条件: 日付 (最も早い Session.date_from と最後の Session.date_to)、Average TeacherRating (例: 最小値 = 3)、CourseSignups (例: 最小 5 人のユーザーがサインアップ) (これらのオプションは GET パラメーターを介して渡されます。例: sort=date_ascending&f_min_date= 10.10.12&...)
そのための関数をどのように作成しますか?
使ってみました
- 非正規化(必要なフィルター/ソート基準のためにコースにフィールドを追加し、変更が発生するたびに更新しました)、私はそれにあまり満足していません(たとえば、各 TeacherRating の後に多くの更新が必要です)。
- ForeignKey クエリ (Course.objects.filter(session__date_from=xxx)) ですが、後でパフォーマンスの問題が発生する可能性があります..
ヒントをありがとう!