0

私はフィットネスゲームのウェブアプリに取り組んでいます。アイデアは、毎週、次の週が明らかになる前に人が完了しなければならない特定の数のタスクがあるということです。models.pyこれまでのアプリのスキーマは次のとおりです。

django.dbからモデルをインポートしますdjango.contrib.auth.modelsからインポートユーザー

class WeekOne(models.Model):
    squats = models.PositiveIntegerField()
    lunges = models.PositiveIntegerField()
    skipStairs = models.BooleanField()
    stairDaysCount = models.PositiveSmallIntegerField()
    # Set to true if (squats == 1000), (lunges == 250), 
    # (skipStairs is True), and (stairDaysCount == 3)
    weekOneComplete = models.BooleanField()

class UserProfile(models.Model):
    user = models.OneToOneField(User)
    weekOne = models.ForeignKey(WeekOne)

私はいくつかの点で迷っています。まず第一に、明らかに私は各ユーザーが自分の進捗状況を追跡できるようにし、他のユーザーがそれを見ることができないようにしたいのです。これを行うための最良の方法を作っweekOneていますか?ForeignKeyもしそうなら、この関係が定義された後、各ユーザーのデータへのアクセスはどのように機能しますか?たとえば、addSquats関数を作成したい場合は、次のようにしますか?

user = UserProfile()
user.squats += 5

または、スクワットフィールドに到達するために他の魔法を実行する必要がありますか?

次に、ユーザーが進捗状況を変更する(つまり、スクワットまたはランジを追加する)たびに、すべてのフィールドが特定のベンチマークを満たしているかどうかを確認したいと思います。weekOneCompleteもしそうなら、私はtrueに設定したいと思います。ユーザーがボタンをクリックすると、各追加はJavaScriptによってトリガーされますが、データベースをチェック/更新する関数はどこに配置しますか?

4

3 に答える 3

1

2番目の質問に対して:javascriptを使用していると言うので、これを行うための1つの可能な(そして簡単な)方法は、ajax呼び出しを使用することです。

リクエストで送信するデータを処理するビューを指すURLを指す必要があります。(POSTリクエストを使用しているとしましょう)の行に沿った何か:

def add(request):
    if not request.is_ajax():
        raise ...
    excercise, amount = request.POST['excercise'], request.POST['amount']
    user = request.user

    # a model method that'll add to whatever activity 
    # the user did and update the "week one complete" field
    user.did_activity(excercise, amount) 
    if user.weekOne.weekOneComplete:
        return HttpResponse(json.dumps(some_return_data), mimetype="application/json")
    return HttpResponse(json.dumps(other_return_data), mimetype="application/json")

これは擬似コードの側にあるので、あなたはその考えを理解します。それでも、JS側でajax呼び出しを作成する必要があります。これは、正しい演習に追加してベンチマークを検証し、ユーザーをデータベースに保存するモデルメソッドです。例えば:

def did_activity(self, excercise, amount):
    if excercise == 'squats':
        self.weekOne.squats += amount
    ...
    if self.hit_benchmark():
        self.weekOne.weekOneComplete = True
    self.save()

また、この例では、ユーザーが認証されていることを前提としています。

幸運を。

于 2013-03-20T21:07:20.890 に答える
1

まず第一に、当然のことながら、各ユーザーが自分の進行状況を追跡できるようにし、他のユーザーがそれを見ることができないようにしたいと考えています。

テンプレートでは、このようにすることができます

 User: {{ user.username }}
 squats: {{ user.userprofile.squats }} 
 lunges: {{ user.userprofile.lunges }}
 Skip Stairs: 
    {% if user.userprofile.skipStairs %}
       Yes
    {% else %}
       No
    {% endif %}
 Stair: {{ user.userprofile.stairDaysCount }}}
 Week Completed: 
    {% if user.userprofile.weekOneComplete %}
        Yes
    {% else %}
        In-Progress
    {% endif %}

この関係が定義されると、各ユーザーのデータへのアクセスはどのように機能しますか? たとえば、addSquats 関数を作成したいとします。

ユーザーデータにアクセスするには、

user = UserProfile(user=request.user)
user.weekOne.squats += 5
user.weekOne.save()
user.save()

第 2 に、ユーザーが進行状況を変更する (つまり、スクワットやランジを追加する) たびに、すべてのフィールドが特定のベンチマークを満たしているかどうかを確認したいと考えています。持っている場合は、weekOneComplete を true に設定します。

UserProfile モデルの下に、更新チェック機能を作成します。

class UserProfile(models.Model):
    user = models.OneToOneField(User)
    weekOne = models.ForeignKey(WeekOne)

    def check_updates(self):
        check = WeekOne.object.get(id=self.weekOne)

        if check.skipStairs and \
           check.squats == 1000 and \
           check.lunges == 250 and \
           check.stairDaysCount == 3:

           check.weekOneComplete = True
           check.save()

したがって、そのユーザーのデータを更新するたびに、次のようにメソッドを呼び出すだけです。

user = UserProfile.objects.get(user=request.user)
user.check_updates()
于 2013-03-21T03:11:53.287 に答える
1

週 1 のフィールドにアクセスするには、次の手順を実行する必要があります。

user.weekOne.squats += 5
user.weekOne.save()

実際には、F 関数を使用して (または同様のことを) 実行することをお勧めします。

user.weekOne.squats = F('squates') + 5

一般に、サーバー側でもすべてのチェックを行い、クライアント (JS など) に依存しない方がよいでしょう。たとえば、URL を公開し、すべての POST パラメータが整数であることを確認します (たとえば、int に変換されます)。

于 2013-03-20T20:51:24.823 に答える