2015-09-28 37 views
0

我已經遍尋搜索,無法找到答案。我真的不明白爲什麼這不起作用,尤其是因爲它在其他項目中起作用。無論如何,當用戶得到正確的問題時,我試圖將模型字段增加1。我使用Django 1.8和Python 3.5與factory_boy創建測試數據。即使在調用save()後,Django字段仍然不會增加()

這裏的views.py功能:

def check_answer(request): 
    front = request.POST.get('front') 
    userAnswer = request.POST.get('ans') 
    answerCards = Card.objects.filter(front=front) 
    for ans in answerCards: 
     if ans.back == userAnswer: 
      ans.score += 1 
      ans.save() # at this point calling print(ans.score) will return 1 
      return HttpResponse('correct') 
    answerCards.update(score=F('score') - 1) # using print statements I know it isn't hitting this line 
    return HttpResponse('wrong') 

下面是相關的models.py代碼:

class Card(models.Model): 
    front = models.CharField(max_length=512) 
    back = models.CharField(max_length=512) 
    deck = models.ForeignKey(Deck) 
    score = models.IntegerField(default=0) 

    def __repr__(self): 
     return self.front + ' - ' + self.back 

下面是相關tests.py代碼:

class UserFactory(factory.DjangoModelFactory): 
    class Meta: 
     model = User 

    username = factory.Sequence(lambda n: 'user%d' % n) 
    password = factory.Sequence(lambda n: 'pass%d' % n) 


class DeckFactory(factory.DjangoModelFactory): 
    class Meta: 
     model = Deck 

    author = factory.SubFactory(UserFactory) 
    title = fuzzy.FuzzyText() 
    description = fuzzy.FuzzyText() 


class CardFactory(factory.DjangoModelFactory): 
    class Meta: 
     model = Card 

    front = fuzzy.FuzzyText() 
    back = fuzzy.FuzzyText() 
    deck = factory.SubFactory(DeckFactory) 
    score = random.randint(-20, 10) 


class TestNotecardViews(TestCase): 

    def test_add_score_to_card(self): 
     # this test passes 
     card = CardFactory(score=0) 
     card.score += 1 
     card.save() 
     self.assertEqual(1, card.score) 

    def test_check_answer(self): 
     deck = DeckFactory.create() 
     card = CardFactory.create(front='test', 
            back='tset', 
            deck=deck, 
            score=0) 
     # test correct answer 
     data = { 
       'front': card.front, 
       'ans': 'tset', 
     } 
     resp = self.client.post(reverse('check_answer'), data=data) 
     self.assertContains(resp, 'correct', 1) # this test passes 
     self.assertEqual(card.score, 1) # this test fails 

什麼特別令人沮喪的是,價值並沒有的變化,它只是沒有在改變它的函數返回後,即使在調用save()之後,仍然保持這種狀態。

回答

1

在調用視圖後,您需要從數據庫中重新加載本地版本card。否則它們之間沒有任何關係,並且card無法知道數據庫已更新。

resp = self.client.post(reverse('check_answer'), data=data) 
card = Card.objects.get(id=card.id) 
self.assertEqual(card.score, 1) 
+0

工作正常!沒意識到你必須像這樣重新加載它。現在我知道,謝謝! –

相關問題