Django DateField在test中返回DateTime对象

时间:2014-08-25 06:17:18

标签: django django-models django-rest-framework django-testing

我使用Django 1.7b2和Django REST框架编写一些测试用例。

有一个自定义用户模型,其birthday字段添加如下。

class User(AbstractBaseUser):

    first_name = models.CharField(max_length=30, blank=True)
    last_name = models.CharField(max_length=30, blank=True)
    email = models.EmailField(blank=True)
    ...
    ...

    gender = models.IntegerField(choices=Gender.CHOICES, default=Gender.UNKNOWN)
    birthday = models.DateField(default=timezone.datetime.today())

然后我创建了TestAPI。

class ApiTest(TestCase):
    def setUp(self):
        user, created = User.objects.get_or_create(
            username="username",
            email="uname@app.com",
            first_name="fname",
            last_name="lname",
        )    
        self.factory = APIRequestFactory()
        self.client = APIClient()



def test_user_put(self):
    print self.user.birthday
    data = {
            "first_name": self.user.first_name,
            "last_name": self.user.last_name,
            "email": self.user.email,
            "gender": self.user.gender,
            "birthday": self.user.birthday,
    }
    response = self.client.put(reverse('user-detail', args=[self.user.pk]), data)
    self.assertEqual(response.status_code, 200)

问题在于,当我使用空数据库运行此测试时,它会引发birthday is not in valid错误,因为测试功能会打印datetime object而不是date object。< / p>

但是,在我将几个用户添加到数据库后,它会通过测试。

我用不同的定义(使用日期时间而不是时区等)重复了3-4次,但无法解决问题。

这是我想念的东西还是框架中的潜在错误?

1 个答案:

答案 0 :(得分:1)

来自the django docs regarding DateField

<强> DateField.auto_now_add

首次创建对象时自动将字段设置为现在。用于创建时间戳。请注意,始终使用当前日期;它不仅仅是您可以覆盖的默认值。

所以尝试编写这样的代码:

birthday = models.DateField(auto_now_add=True).