Я уже написал один вопрос о том же проекте, так что, надеюсь, это не раздражает, но мне действительно нужно убедиться, что я знаю, что я делаю с ForeignKey, поэтому я не (а) избегать этого или (б) развивать вредные привычки.Обертывание моей головы вокруг внешних ключей
Я работаю над игрой для тренировки, где каждый пользователь имеет свою собственную учетную запись. Игра делится на различные «недели», каждая неделя имеет различные контрольные показатели, которые пользователь должен выполнить, прежде чем сможет перейти к следующей неделе. Вот пример того, как я модель недели:
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 и т.д. поле, поэтому я думал, что способ сделать это было бы создать
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()
Это, кажется, не работает: а ForeignKey
поле в UserProfile (расширение пользователя) модель, как и так. Я создал представление, где я прохожу контекст этой модели в шаблон, например, так:
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 и где я ошибаюсь, пытаясь использовать их в своих взглядах и шаблонах?
Может ли пользователь иметь более одной недели? Если нет, возможно, вы должны изменить 'ForeignKey' на' OneToOneField' или использовать его как 'user.weekOne_set [0] .squats', но я не уверен в синтаксисе. – EralpB
Нет, у WeekOne есть константы в качестве эталонных тестов, но такие вещи, как поля для приседаний, выпадений, skipStairs, изменяются в зависимости от того, какие данные вводит пользователь. – user1427661
вы вчера не читали мой ответ на свой вопрос. Я рассказываю о том, как получить доступ к данным для пользователя. Вы полностью изменяете check_updates. Ваши последующие инструкции. – catherine