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

要访问第一周的字段,您需要执行以下操作:

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

实际上,最好使用 F 函数并执行(或类似):

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

一般来说,最好在服务器端进行所有检查,而不是依赖客户端(JS 或其他)。例如,您公开一个 url 并检查所有 POST 参数是否为整数(例如转换为整数)

于 2013-03-20T20:51:24.823 回答
1

对于您的第二个问题:由于您说您使用的是javascript,因此一种可能(且简单)的方法是通过ajax调用。

它应该指向一个 url,该 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()

其次,每次用户对他们的进度进行更改(即增加深蹲或弓步)时,我想检查所有字段是否都达到了某个基准。如果有,我想将 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 回答