Django 1模型-DateTimeField()

时间:2018-08-20 18:16:17

标签: python django django-models

我对Django和编程领域非常陌生,并且面临着前所未有的挑战。我需要有关DateTimeField()的帮助。

作为一个学习项目,我正在设置一个简单的旅行应用程序。我希望用户能够添加旅行,说明等。到目前为止,一切都很好。

我想在旅行模型中添加两​​个DateTimeFields。输入的起始日期必须是将来的日期(从他们使用该应用程序的时间起),而终止日期必须在起始日期(natch)之后。如何将此编程到我的模型中?

这是我的Trip类的当前代码:

class Trip(models.Model):
    destination = models.CharField(max_length=55)
    description = models.TextField()
    start_date = models.DateTimeField(??)
    end_date = models.DateTimeField(??)

    travellers = models.ManyToManyField(User, related_name="trips")

    planned_by = models.ForeignKey(User, on_delete=models.CASCADE, related_name="trips_added")

    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

谢谢。

更新

谢谢你们,我越来越近了。但是,我认为我缺少的DateField中有一两道皱纹(我实际上不需要DateTimeField)。这是模型中的Trip表:

class Trip(models.Model):
    destination = models.CharField(max_length=55)
    description = models.TextField()
    start_date = models.DateField(null=True)
    end_date = models.DateField(null=True)

    travelers = models.ManyToManyField(User, related_name="trips")

    planned_by = models.ForeignKey(User, on_delete=models.CASCADE, related_name="trips_added")

    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    objects = TripManager()

在模型中,在TripManager下,我还具有以下验证方法:

def trip_validation(self, postData):

        errors = {}

        if len(postData['destination']) < 1:
            errors['destination'] = 'You must enter trip destination.'

        if len(postData['description']) < 1:
            errors['description'] = 'You must enter trip description.'

        if len(postData['start_date']) < 1:
            errors['start_date'] = 'Please enter a start date for your trip.'
        elif not postData['start_date'] > timezone.now():
            errors['start_date'] = 'Your trip start date must be in the future.'

        if len(postData['end_date']) < 1:
            errors['end_date'] = 'Please enter an end date for your trip.'
        elif not self.end_date > self.start_date:
            errors['end_date'] = 'Trip end date must be after start date.'

        return errors

在视图中,我调用trip_validation方法,并通过上下文字典将错误发送到模板。

elif not postData['start_date'] > timezone.now():elif not self.end_date > self.start_date:之外,所有验证方法均有效。

我收到以下错误:TypeError at /trips/add/ can't compare datetime.datetime to unicode

这使我相信我没有正确地使用内置的DateField函数。

谢谢。

3 个答案:

答案 0 :(得分:1)

我更愿意将这些字段设置为blank=Truenull=True,并通过覆盖 save()进行一些 验证检查 } 模型的方法,如

Trip

答案 1 :(得分:0)

您不在模型中这样做。该模型只是数据库中的一个表,因此您只需定义start_date和end_date字段的类型为DateTimeField。您可以在这里找到更多信息:Django Models

您想要完成的工作可以在Django的其他部分中完成,例如在视图中。在那里,当您获得用户插入的日期时,可以验证start_date在将来,而end_date在以后。

答案 2 :(得分:0)

比较之前,您需要转换为正确的数据类型。 您可以如下所示使用datetime.strptime()。

from datetime import datetime

s_date = datetime.strptime(postData['start_date'], "%Y-%m-%d")
e_date = datetime.strptime(postData['end_date'], "%Y-%m-%d")