Skip to main content
 首页 » 编程设计

python之Django 1 模型之DateTimeField()

2024年12月31日25mfryf

我对 Django 和一般编程还很陌生,我面临着以前从未见过的挑战。我正在寻找有关 DateTimeField() 的一些帮助。

作为一个学习项目,我正在设置一个简单的旅行应用程序。我希望用户能够添加旅行、描述等。到目前为止,还不错。

我想将两个 DateTimeFields 添加到我的行程模型中。输入的开始日期必须是 future 的日期(从他们使用应用程序的时间开始),而结束日期必须在开始日期(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),我错过了。这是我在模型中的行程表:

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 

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

所有验证方法都有效保存 elif not postData['start_date'] > timezone.now(): 和 elif not self.end_date > self.start_date: .

我收到以下错误:TypeError at/trips/add/ 无法将 datetime.datetime 与 unicode 进行比较。

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

谢谢。

请您参考如下方法:

我更喜欢将这些字段设置为 blank=True 和 null=True 并进行一些验证检查通过覆盖 Trip 模型的 save() 方法,作为

from django.utils import timezone 
from django.core.exceptions import ValidationError 
 
 
class Trip(models.Model): 
    # your fields 
    start_date = models.DateTimeField(<b>blank=True, null=True</b>) 
    end_date = models.DateTimeField(<b>blank=True, null=True</b>) 
 
    # your fields 
 
    <b>def save(self, *args, **kwargs): 
        if self.start_date: 
            if not self.start_date > timezone.now(): 
                raise ValidationError("start_time must be greater than current time") 
        if self.end_date: 
            if not self.start_date: 
                raise ValidationError("start time missing. Please check the data") 
            if not self.end_date > self.start_date: 
                raise ValidationError("end time must be greater than start time") 
        super().save(*args, **kwargs)</b>