2013-03-20 70 views
0

我正在研究健身遊戲網絡應用程序。這個想法是,每個星期都有一定數量的任務,一個人必須在下週之前完成任務。這是我models.py架構的應用至今:正確定義Django DB中的關係

從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 a ForeignKey這樣做的最好方法?如果是這樣,一旦定義了這種關係,訪問每個用戶的數據是如何工作的?例如,如果我想創建一個addSquats功能,我會做這樣的事情:

user = UserProfile() 
user.squats += 5 

或者我會做一些其他的魔法才能到蹲場?其次,每次用戶對其進度進行更改(即增加一個下蹲或弓步)時,我想檢查是否所有字段都符合某個基準。如果他們有,我想將weekOneComplete設置爲true。當用戶點擊一個按鈕時,每個添加都會被一些JavaScript觸發 - 但是我會在哪裏放置檢查/更新數據庫的函數?

+2

問題標題似乎與從問題的問題本身:) – isedev 2013-03-20 20:48:10

+0

HAHAH,緩繳賠率我從來沒問過。 ;-) – user1427661 2013-03-20 20:58:05

回答

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() 
1

要訪問一週一個領域,你需要做的:

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

其實,最好是使用F功能,做(或類似):

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

一般來說,最好在服務器端進行所有檢查,而不要依賴客戶端(JS或其他)。例如,你公開一個URL並檢查它們是整數的所有POST參數(例如,轉換爲整數)

1

第二個問題:一種可能的(也是簡單的)做法,因爲你說你正在使用javascript ,通過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() 

此外,此示例假定用戶已通過身份驗證。

祝你好運。