微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

带有@classmethod 测试的Django 模型

如何解决带有@classmethod 测试的Django 模型

我的模型测试有问题。 我有模型。

>  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)

并按照您在函数中指定的方式传递 dbfields_namesvalues 参数。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。