2016-10-21 4 views
3

ユーザーがサインアップして読書を開始できるブックアプリケーションを作成しています。Djangoのユーザーアクティビティの監視

これは本のためmodel.pyです:

from django.db import models 
from django.urls import reverse 

from django.conf import settings 


class Chapter(models.Model): 
    title = models.CharField(max_length=200, unique=True) 
    slug = models.SlugField(unique=True) 
    date_completed = models.DateTimeField(blank=True, null=True) 

    completed = models.BooleanField(default=False) 

    def __str__(self): 
     return self.title 

    def get_absolute_url(self): 
     return reverse("course:subchapter_list", kwargs={"pk": self.pk}) 


class SubChapter(models.Model): 
    chapter = models.ForeignKey(Chapter, on_delete=models.CASCADE) 
    title = models.CharField(max_length=200, unique=True) 
    slug = models.SlugField(unique=True) 

    completed = models.BooleanField(default=False) 

    def __str__(self): 
     return self.title 


class SubSection(models.Model): 
    sub_chapter = models.ForeignKey(SubChapter, on_delete=models.CASCADE) 
    title = models.CharField(max_length=200, unique=True) 
    slug = models.SlugField(unique=True) 
    text = models.TextField(null=True, blank=False) 

    completed = models.BooleanField(default=False) 

    def __str__(self): 
     return self.title 

    def get_absolute_url(self): 
     return reverse("course:detail", 
         kwargs={"slug": self.sub_chapter.slug, 
           "slug2": self.slug, 
           "pk": self.sub_chapter.chapter.pk, 
           } 
         ) 

どのように私は、そのモデルのインスタンスの完成属性がに設定されているように、サブセクション/サブチャプター/チャプターを見たとき/読むことを各ユーザーの進捗状況を監視することができますそのユーザーのためだけに本当ですか?私の現在の実装はすべての人にとってTrueに設定されています。

どのように実装するかを示すコードスニペットがあります。

+0

これは、特定のユーザーがモデルインスタンスの1つに対して取得要求を行ったときに実行されるため、ビューでこれを行うことができます。 – Evert

+0

基本クラスの作成を検討したいと思うかもしれません。なぜなら、あなたが求めているロジックを含め、3つのクラスの間に共通点があると思われるからです。 – Evert

+0

Djangoの[signals](https://docs.djangoproject.com/en/dev/topics/signals/)セクションを読むこともできますが、それは有用でないかもしれません。それはまた、論理の一部を難読化する可能性があります。まず、特定のビューのget要求でこれを処理できるかどうかを確認します。 – Evert

答えて

1

すべてのユーザーの読み取りの進行状況を監視する場合は、ChapterSubChapterおよびSubSectionモデルでは完了したフィールドを持つことはできません。ユーザーに関連する新しいフィールドが必要です。

class ReadingProgress(models.Model): 
    user = models.ForeignKey(User) 
    completed_chapter = models.ForeignKey(Chapter) 
    completed_subchapter = models.ForeignKey(SubChapter) 
    completed_subsection = models.ForeignKey(SubSection) 

書籍が異なる場合は、ブックモデルにも外部キーを追加する必要があります。

次に、チャプター、セクションなどを取得するビューで、特定のユーザー(およびブック?)のReadingProgressオブジェクトを取得し、対応する値を設定することができます。