7

次の値とモデルのフィルターソート 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)) ですが、後でパフォーマンスの問題が発生する可能性があります..

ヒントをありがとう!

4

2 に答える 2

4

複雑なルックアップを確認することをお勧めします: https://docs.djangoproject.com/en/1.5/topics/db/queries/#complex-lookups-with-q-objects

次のクエリはあなたのケースではうまくいかないかもしれませんが (教師モデルはどのように見えますか?)、複雑なルックアップの使用方法を示すものとして役立つことを願っています。

from django.db.models import Q

Course.objects.filter(Q(session__date__range=(start,end)) &
                      Q(teacher__rating__gt=3))

絶対に必要でない限り、私は実際に非正規化から遠ざかります。

あなたの並べ替えの質問は、私には完全に明確ではありませんでした。date_from でフィルタリングされたコースを表示し、日付、名前で並べ替えますか?

于 2012-11-23T18:01:03.023 に答える