45602
はじめまして。週末に趣味でプログラミングをしている日曜プログラマーなのですが、pythonに慣れており、djangoを使って下記のような生徒向けの問題管理ページを作成したいと考えております。

ひととおりdjango公式のチュートリアルの内容や、一通り作成と動作確認や、シェルを使ってdjangoのモデルの概念やpythonに関してはある程度概念がわかっているつもりなのですが、下記のような仕組みを作るにあたって、どのようなモデルをデザインすれば良いか悩んでおり、質問させていただきます。

データベースに関しても、一通り一般的なsqlは理解しており、正規化に関しても独学で勉強しました。

一応flaskでは簡単な従業員の日報管理フォームを作成して、さくらサーバーでデプロイするぐらいのことはできたレベルです。

不勉強なところも多いですが、助言いただけると幸いです。

作成するview：

  1. ログインユーザー（生徒）のページ
  2. 数学問題の一覧ページ
  3. 数学問題の詳細ページ
  4. 3の詳細ページを開く前に、本当にこのページを開くかどうか確認するページ
  5. 1のログインページに、解いた（詳細ぺーじを開いたかどうか）ページの一覧を確認できる表示

■ 実現したいこと：  
ログインしたユーザー（1.の生徒）が、2の数学の問題一覧（簡単なタイトルなど）をみて、自分（生徒自身）で解きたいページを開いて（3.の詳細ページを確認）回答する。

毎回、ログインした時に、なんの問題を解いたか（5のように一覧ページを設ける？）のと、2の一覧ページにアクセスするたびに、解いたページはわかるように、リストの下に回すなど。のわかりやすいように表示をしたい。

■ 質問について：  
最終的に実現したいのは上記なのですが、最初は、フィルターを作成して、2.の一覧ページでは、未回答のチェックを入れて、リロードするような感じで一覧ページを再表示させて作成できるかな？と考えていますが、ユーザーの情報のモデルと、数学問題のモデルをどのように管理すれば良いかが悩んでおり、質問になります。

もしかしたらタイトルの意味合いが違うかもしれないですがご指摘いただければと思います。どのようなモデルを作成するのが、管理と表示が簡単にできるかご教示してくださる方がいらっしゃいましたら何卒宜しくお願い致します。
CC BY-SA 4.0
2018-07-13T19:25:59.650
45593
2018-07-14T04:06:15.363
29307
question
python3 django
django の閲覧権限を細かく設定し集計したい。
> 生徒向けの問題管理ページを作成したい

上記のようなシステムは、 **LMS（学習管理システム）** に分類されると思います。  
オープンソースのLMSとして以下のものがあるようです。

  * [Moodle](https://github.com/moodle/moodle)（PHP）
  * [Canvas](https://github.com/instructure/canvas-lms/wiki)（Ruby）
  * [RELATE](https://github.com/inducer/relate) (Python Django)

DjangoでLMSを作成したいのであれば、まずは、 **RELATE** のモデルを参考にされてはいかかがでしょうか?

参考: [まだ Moodle で消耗してるの？ オープンソースの Python製
LMS「RELATE」が圧倒的にカスタマイズしやくてヤバイぞ！](http://akiyoko.hatenablog.jp/entry/2017/12/19/235108)
CC BY-SA 4.0
2018-07-13T23:54:17.920
45598
2018-07-13T23:54:17.920
45593
answer
数学の問題を表示するシステムを作る場合に問題になるのが、数式の表示をどうするかということです。PythonではJupyter
Notebookで数式が簡単にかけるのでPythonを選択したのは正解です。しかしながら、Jupyter
Notebookを管理するのも結構手間になる場合があるので、ブラウザーでTexを表示できるJavaScriptのライブラリ`KaTeX`や`MathJax`を使う方がもっと便利です。

`KaTeX`や`MathJax`を今すぐにではなくても将来的に使うと言うことであれば、クライアント側でレンタリングすることを考えておいた方がいいし、時代の流れとしても、ブラウザーのJavaScriptの処理が速くなっているので、クライアントレンダリングを意識しておいた方がいいでしょう。Djangoの機能の殆どはサーバーサイドレンダリングの機能なので、Djangoの機能をあまり使わずに設計した方がいいと思います。

まず、ユーザー管理については、認証はdjangoの付属のものを使ってもいいのですが、JavaScriptを使う場合は`Firebase
Authentication`のようなサービスを使った方が楽な場合が多いです。それで、認証用のデータベースをカスタマイズするよりは不足する分は別にユーザー情報のデーターベースを作っておいた方がいいと思います。

質問のメインの内容になりますが、Webはステートレスなのでアクセスがある毎にデータベースにデータを取りに行くのが基本になります。それで生徒からの回答のデータベースを下のように作っておいて

```

    from sqlalchemy import Column, Integer, String
    class 回答(Base):
        __tablename__ = 'users'
    
        id = Column(Integer, primary_key=True)
        ユーザーID = Column(String)
        問題ID = Column(String)
        回答 = Column(String)
    
        def __repr__(self):
            return "<回答(ユーザーID='%s', 問題ID='%s', 回答='%s')>" % (
                             self.ユーザーID, self.問題ID, self.回答)
    
```

Djangoでログインしているユーザーの情報は取得できるので、アクセスがある毎に次のような感じでユーザーの回答済みの問題の一覧を取得します。

```

    回答済 = conn.execute('SELECT 問題ID FROM 回答 WHERE ユーザーID = :user', user=user).fetchall() 
    
```

ログインした時に、なんの問題を解いたかを表示するのは、その「回答済」を表示すればいいし、未回答のチェックを入れたいときはデータベース側で`LEFT
JOIN`を使ってもいいし、Pythonで計算して処理をしても可能です。
CC BY-SA 4.0
2018-07-14T03:25:03.930
45602
2018-07-14T04:06:15.363
2018-07-14T04:06:15.363
15171
15171
45593
answer