2015-04-22 87 views
0

我試圖重寫save()方法,因此Category類的字段views只接受正數或零。 (這是一個從Tango with Django 1.7 Chapter 20練習)Django:在模型中覆蓋save()方法

models.py:

class Category(models.Model): 
    name = models.CharField(max_length=128, unique=True) 
    views = models.IntegerField(default=0) 
    like = models.IntegerField(default=0) 
    slug = models.SlugField(unique=True) 

    def save(self, *args, **kwargs): 
     self.slug = slugify(self.name) 
     if self.views < 0: 
      return 
     else: 
      self.slug = slugify(self.name) 
      super(Category, self).save(*args, **kwargs) 

    def __str__(self): 
     return self.name 

    class Meta: 
     verbose_name_plural = "Categories" 

test.py:

class CategoryMethodTests(TestCase): 
    def test_ensure_views_are_positive(self): 
     """ 
     ensure_views_are_positive should return True for categories where views are zero or positive 
     """ 
     cat = Category(name='test', views=-1, like=0) 
     cat.save() 
     self.assertEqual((cat.views >= 0), True) 

即使我加入了條件if self.views < 0models.py測試失敗:

Creating test database for alias 'default'... 
F 
====================================================================== 
FAIL: test_ensure_views_are_positive (rango.tests.CategoryMethodTests) 
---------------------------------------------------------------------- 
Traceback (most recent call last): 
    File "/home/pm/tango_project/rango/tests.py", line 11, in test_ensure_views_are_positive 
    self.assertEqual((cat.views >= 0), True) 
AssertionError: False != True 

---------------------------------------------------------------------- 
Ran 1 test in 0.001s 

FAILED (failures=1) 
Destroying test database for alias 'default'... 

問題在哪裏?

+0

爲什麼self.assertEqual()使用self.assertTrue(),和Django的有PositiveIntegertField https://docs.djangoproject.com/en/1.8/REF /模型/場/#positiveintegerfield –

回答

1

cat是python中的一個對象。它不會改變,除非你明確地改變它。您的數據庫不會有它cat,你的測試應該是:

self.assertEqual(Category.objects.count(), 0) 

但變量cat將在該範圍中不存在,你創建的但它。

當您測試cat.views時,它只會檢查您剛剛創建的cat實例中views字段的值。這與你的數據庫無關。

0

有幾件事情可以輕鬆做到。第一點是

  • 你可以使用正整場在Django,如果你只想要正整數在這個模型

  • ,如果你想要做的定製方式,請引發異常或使用聲明它的聲明。然後,在測試的情況下可以檢查異常或斷言錯誤是否引發