为什么我的django单元测试未通过约束?

时间:2020-07-24 19:44:56

标签: python-3.x django unit-testing constraints

我有这个模型:

class TestopiaEvent(Model):
    event_id = AutoField(primary_key=True)
    name = CharField(max_length=255)
    start_date = DateField()
    end_date = DateField()
    testers_required = IntegerField()

    class Meta:
        constraints = [
            CheckConstraint(
                check=Q(start_date__lte=F('end_date'), start_date__gte=datetime.now().date()),
                name='correct_datetime'
            )
        ]

这个测试:

class TestopiaEventTestCase(TestCase):
    def setUp(self):
        self.default_values = {
            'name': 'Testopia 1',
            'start_date': datetime.now().date(),
            'end_date': datetime.now().date() + timedelta(days=1),
            'testers_required': 1
        }
        self.testopia_event = TestopiaEvent(**self.default_values)

    def test_save_with_valid_model_check_database(self):
        self.assertIsNone(self.testopia_event.save())

它失败并显示此错误:

django.db.utils.IntegrityError: new row for relation "webserver_testopiaevent" violates check constraint "correct_datetime"
DETAIL:  Failing row contains (1, Testopia 1, 2020-07-24 00:00:00+00, 2020-07-25 00:00:00+00, 1).

我不明白为什么会失败,因为只有当今天的日期小于开始日期和开始日期或/和开始日期大于结束日期(不是)时,它才会失败吗?< / p>

我做错了什么?谢谢

编辑:这是postgresdb约束:

testopia =#\ d + webserver_testopiaevent 表格

"public.webserver_testopiaevent"
      Column      |          Type          | Collation | Nullable |                          Default                          | Storage  | Stats target | Description 
------------------+------------------------+-----------+----------+-----------------------------------------------------------+----------+--------------+-------------
 event_id         | integer                |           | not null | nextval('webserver_testopiaevent_event_id_seq'::regclass) | plain    |              | 
 name             | character varying(255) |           | not null |                                                           | extended |              | 
 start_date       | date                   |           | not null |                                                           | plain    |              | 
 end_date         | date                   |           | not null |                                                           | plain    |              | 
 testers_required | integer                |           | not null |                                                           | plain    |              | 
Indexes:
    "webserver_testopiaevent_pkey" PRIMARY KEY, btree (event_id)
Check constraints:
    "correct_datetime" CHECK (start_date >= statement_timestamp() AND start_date <= end_date)
Access method: heap

1 个答案:

答案 0 :(得分:0)

Now()返回一个DateTimeField(),因此,如果我的DateField设置为同一日期,则加上时间戳记后,该日期将大于当前日期。