0

我已经发布了一个关于同一个项目的问题,所以希望这不会烦人,但我真的需要确保我知道我在用 ForeignKey 做什么,所以我不会 (a) 避免它或 (b)养成坏习惯。

我正在开发一个健身游戏,每个用户都有自己的帐户。游戏分为不同的“周”,每周都有不同的基准,用户必须满足这些基准才能进入下周。以下是我如何为周建模的示例:

class WeekOne(models.Model):
    # Required benchmarks for given exercises 
    squatBenchmark = 1000
    lungBenchmark = 250
    stairDaysCountBenchmark = 3
    squats = models.PositiveIntegerField()
    lunges = models.PositiveIntegerField()
    skipStairs = models.BooleanField()
    stairDaysCount = models.PositiveSmallIntegerField()
    # Set to true if benchmarks reached. 
    weekOneComplete = models.BooleanField()

现在,我希望每个用户都有自己的深蹲、弓步、skipStairs 等字段,所以我认为这样做的方法是ForeignKey在 UserProfile(用户的扩展)模型中创建一个字段,如下所示:

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

    def checkUpdates(self):
        if self.WeekOne.squats >= WeekOne.squatBenchmark and \
            self.WeekOne.lunges >= WeekOne.lungBenchmark and \
            self.WeekOne.stairsDayCount >= WeekOne.stairDaysCountBenchmark and \
            self.WeekOne.skipStairs:
                self.WeekOne.weekOneComplete = True
                self.save()
                self.WeekOne.save()

这似乎不起作用。我创建了一个视图,在其中将此模型的上下文传递给模板,如下所示:

def workout1(request):
    user = UserProfile(user=request.user)
    template = "workout1.html"
    context = {'user': user}
    return render(request, template, context)

但是当我尝试user.weekOne.squats在我的模板中显示时,我得到了一个 DoesNotExist 错误。此外,我希望能够显示WeekOne像 squatBenchmark 这样的“静态”变量,但WeekOne.squats在我的 Django 模板中也无法识别。谁能给我任何关于我是否正确使用 ForeignKeys 以及在我的视图和模板中尝试使用它们时哪里出错的见解?

4

1 回答 1

1

你所指的任何地方,self.WeekOne我认为你的意思是指self.weekOne

weekOne 是实例变量。UserProfile 实例没有这样的属性 WeekOne。

标准 Python 命名约定建议您将week_one其用作属性名称。为你重写 checkUpdates...

class UserProfile(models.Model):

    user = models.OneToOneField(User) week_one = models.ForeignKey(WeekOne)

    def check_updates(self):
        if (self.week_one.squats >= WeekOne.squatBenchmark and
            self.week_one.lunges >= WeekOne.lungBenchmark and
            self.week_one.stairs_day_count >= WeekOne.stair_days_count_benchmark and
            self.week_one.skip_stairs):
                self.week_one.week_one_complete = True
                self.save()
                self.week_one.save()

在您的视图代码中,您正在创建一个 UserProfile 对象,但您永远不会保存它。不过,您可能不想每次收到请求时都创建新的用户配置文件。Django 有一些用于自动创建用户配置文件的内置机制。此外,您永远不会创建 WeekOne 实例。就像是

profile = UserProfile(user=request.user)
week_one = WeekOne()
week_one.save()
profile.week_one = week_one
profile.save()

在那里,您正在为用户创建配置文件,创建 WeekOne 的实例,将其添加到配置文件中,并将它们都保存到数据库中。

于 2013-03-21T23:38:50.487 回答