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()之後,仍然保持這種狀態。
工作正常!沒意識到你必須像這樣重新加載它。現在我知道,謝謝! –