我有一个带有重写保存方法的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)
不幸的是,最后一个断言失败了。我不明白为什么,因为一般来说,它在管理界面中测试行为时是有效的(即不在测试套件中)。
我做错了吗?
答案 0 :(得分:1)
您尚未从数据库重新加载o1。当db执行时,模型实例不会自动更新:您需要显式获取更新的数据。
o1 = MyModel.objects.get (pk=o1.pk)
self.assertEqual(o1.flag, False)
请注意,您的保存方法非常低效:最好在一个查询中执行:
MyModel.objects.filter(flag=True).exclude(pk=self.pk).update(flag=False)