Django后台添加航班报错'bool'无'utcoffset'属性及字段疑问
问题解决步骤
1. 修复后台添加航班的AttributeError错误
报错根源是Flight模型中DateTimeField和DurationField的default参数设置错误:你给这些字段的default设成了布尔值True,但Django期望的是对应类型的默认值(比如datetime对象、timedelta对象或者None)。
修改Flight模型中的字段定义:
class Flight(models.Model): # 保留原有origin、destination字段... duration = models.DurationField(null=True, blank=True) # 移除错误的default=True,或设置合法默认值如timedelta(hours=2) arrivaltime = models.DateTimeField(null=True, blank=True) departuretime = models.DateTimeField(null=True, blank=True)
如果需要设置默认值,比如默认起飞时间为当前时间,可以这样写:
from django.utils import timezone departuretime = models.DateTimeField(null=True, blank=True, default=timezone.now)
修改后执行数据库迁移:
python manage.py makemigrations python manage.py migrate
2. 修正Airport模型的多对多字段设置
当前设置存在几个可优化点:
- 模型类名不符合Django规范:
runway应改为大写开头的Runway(类名采用大驼峰命名法) - 字段名拼写错误:
airportrunwway多了一个w,建议改为更清晰的runways ManyToManyField的null=True参数多余,多对多字段本身不存储NULL值,只需保留blank=True允许表单为空即可
修正后的模型代码:
class Runway(models.Model): number = models.IntegerField(verbose_name="跑道编号") # 字段名更具语义化 def __str__(self): return f"跑道{self.number}" class Airport(models.Model): code = models.CharField(max_length=64, unique=True) city = models.CharField(max_length=64) runways = models.ManyToManyField(Runway, blank=True, verbose_name="所属跑道") def __str__(self): return f'{self.id}:{self.city} ({self.code})'
3. 实现后台按起降时间排序筛选功能
在admin.py中配置Flight的Admin类,添加排序和筛选功能:
from django.contrib import admin from .models import Flight @admin.register(Flight) class FlightAdmin(admin.ModelAdmin): # 后台列表显示字段 list_display = ('id', 'origin', 'destination', 'departuretime', 'arrivaltime') # 按起降时间排序(负号表示降序) ordering = ('departuretime', 'arrivaltime') # 添加筛选器 list_filter = ('departuretime', 'arrivaltime', 'origin', 'destination')
这样在后台列表页就可以通过侧边栏筛选起降时间,同时列表会默认按起飞时间升序排列。
内容的提问来源于stack exchange,提问作者Janardhan Reddy
相关产品推荐
相关产品推荐

