【问题标题】:Test overridden save method in Django在 Django 中测试覆盖的保存方法
【发布时间】:2014-11-10 17:24:16
【问题描述】:

我有一个 Django 模型,它有一个重写的保存方法,以确保同时只为这个模型的一个实例设置一个特殊字段(标志)。

class MyModel(models.Model):

    flag = models.BooleanField(default=False)

    def save(self, *args, **kwargs):
        if self.flag:
            for o in MyModel.objects.filter(flag=True):
                if o != self:
                    o.flag = False
                    o.save()
        super(MyModel, self).save(*args, **kwargs)

然后我编写了一个测试来确保预期的行为有效。

from django.test import TestCase
from myapp.models import MyModel

class MyAppFlag(TestCase):

    def test_flag_is_set_only_once(self):
        o1 = MyModel(flag=True)
        o1.save()
        self.assertEqual(o1.flag, True)

        o2 = MyModel(flag=True)
        o2.save()
        self.assertEqual(o2.flag, True)
        self.assertEqual(o1.flag, False)

不幸的是,最后一个断言失败了。我不明白为什么,因为通常它在管理界面中测试行为时起作用(即不在测试套件中)。

我做错了吗?

【问题讨论】:

    标签: python django testing django-models


    【解决方案1】:

    您尚未从数据库中重新加载 o1。模型实例不会在数据库自动更新时自动更新:您需要显式获取更新的数据。

    o1 = MyModel.objects.get (pk=o1.pk)
    self.assertEqual(o1.flag, False)
    

    请注意,您的保存方法效率很低:最好在一个查询中完成:

    MyModel.objects.filter(flag=True).exclude(pk=self.pk).update(flag=False)
    

    【讨论】:

      猜你喜欢
      • 2010-10-23
      • 2016-07-26
      • 2016-10-18
      • 1970-01-01
      • 1970-01-01
      • 2010-09-15
      • 2015-12-29
      相关资源
      最近更新 更多