问题描述
我的模型测试有问题。 我有模型。
> class Reminder(models.Model):
> STATUS = (
> (1,'Active'),> (2,'Archived'),> (3,'Deleted'),> )
> user = models.ForeignKey(User,on_delete=models.CASCADE)
> title = models.CharField(max_length=64,blank=False)
> text = models.CharField(max_length=256)
> date_create = models.DateTimeField(auto_Now_add=True,verbose_name="Reminder was created")
> date_start = models.DateField()
> date_finish = models.DateField()
> time_reminder = models.TimeField()
> day_of_week = models.ManyToManyField(DayOfWeek)
> status = models.IntegerField(choices=STATUS,default=1)
def __str__(self):
return r'{} --> {}'.format(self.title,dict(self.STATUS).get(self.status))
@classmethod
def from_db(cls,db,field_names,values):
instance = super().from_db(db,values)
instance._loaded_values = dict(zip(field_names,values))
return instance
def clean(self):
super(Reminder,self).clean()
start = self.date_start
finish = self.date_finish
Now = datetime.datetime.Now().date()
if not self._state.adding:
if self._loaded_values['status'] == 2 and self.status == 1:
if start < Now:
raise ValidationError('Updating: Date start has to be grater current date.')
一切正常,但测试。
def test_Model_test_create_rem_start_gt_Now(self):
reminder2 = Reminder.objects.create(
user=self.user,title='title2',text='text2',date_start=datetime.datetime.strptime('18 Sep 2020','%d %b %Y'),date_finish=datetime.datetime.strptime('19 Sep 2021',time_reminder=self.time
)
reminder2.refresh_from_db() # tried this
try:
reminder2.full_clean()
except ValidationError as err:
self.assertEqual(err.messages[0],' ')
错误:test_Model_test_create_rem_start_gt_Now (myrem.tests.ReminderTestCase) -------------------------------------------------- -------------------- 回溯(最近一次调用最后一次): 文件“/home/cat/Projectsgit/ProjectReminder/Reminder/myrem/tests.py”,第 71 行,在 test_Model_test_create_rem_start_gt_Now 提醒2.full_clean() 文件“/home/cat/Projectsgit/NewReminder/venv/lib/python3.8/site-packages/django/db/models/base.py”,第1216行,在full_clean 自我清洁() 文件“/home/cat/Projectsgit/ProjectReminder/Reminder/myrem/models.py”,第68行,干净 如果 self._loaded_values['status'] == 2 和 self.status == 1: AttributeError: 'Reminder' 对象没有属性 '_loaded_values'
如何包含我的自定义函数“from_db”来测试数据库?或者我该怎么办? 非常感谢!
更新* 我不知道为什么它会这样工作,但我找到了我的解决方案。 如果我尝试直接从实例中获取“_loaded_values”,则它不起作用。
def setUp(self):
self.user = User.objects.create(username='user1',password='123123')
self.monday = DayOfWeek.objects.create(name='Monday')
self.saturday = DayOfWeek.objects.create(name='Sarurday')
self.time = datetime.datetime.strptime('9:00','%H:%M')
self.reminder1 = Reminder.objects.create(
user=self.user,title='title1',text='text1',date_start=datetime.datetime.strptime('20 Sep 2030',date_finish=datetime.datetime.strptime('25 Sep 2030',time_reminder=self.time,)
self.reminder1.day_of_week.add(self.monday.id)
self.reminder1.day_of_week.add(self.saturday.id)
self.reminder1.save()
def test_test(self)
reminder2 = Reminder.objects.create(
user=self.user,date_finish=datetime.datetime.strptime('19 Sep 2020',time_reminder=self.time
)
self.reminder1._loaded_values # does not work
reminder2._loaded_values # does not work
Reminder.objects.all()[1]._loaded_values # it works,if filter - does not work
解决方法
因为它是一个类方法,所以你需要通过没有实例的类来调用它:
Reminder.from_db(db,field_names,values)
并按照您在函数中指定的方式传递 db
、fields_names
和 values
参数。