2015-04-22 88 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,如果你只想要正整数在这个模型

  • ,如果你想要做的定制方式,请引发异常或使用声明它的声明。然后,在测试的情况下可以检查异常或断言错误是否引发