Django:覆盖模型中的save()方法

时间:2015-04-22 16:53:06

标签: python django

我试图覆盖save()方法,以便类views的字段Category仅接受正数或零。 (这是Tango with Django 1.7 Chapter 20

的练习

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 < 0中添加了条件models.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'...

问题出在哪里?

2 个答案:

答案 0 :(得分:1)

cat是python中的一个对象。除非您明确更改它,否则它不会发生变化。您的数据库中没有cat,您的测试应该是:

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

但是变量cat将在您创建它时存在于该范围内。

当您测试cat.views时,它只会检查您刚创建的views实例中的cat字段的值。这与您的数据库无关。

答案 1 :(得分:0)

你可以轻松做几件事。第一点是

  • 如果你只想在这个模型中使用正整数,你可以在Django中使用正整数字段

  • 如果您想要自定义方式,请提出异常或使用assert语句。然后在测试用例中可以检查是否引发了异常或断言错误