Django课程模型添加起止日期字段遇数据库迁移错误求助
解决Django Kurs模型字段迁移错误及Admin面板配置
一、迁移报错原因
你添加的start_time、end_time字段未设置默认值,且即便end_date设了默认,当数据库中已有Kurs数据时,Django需要给现有行的新字段填充值,若字段不允许为空又未指定默认规则,就会触发该错误。
二、修复模型字段(二选一)
方案1:允许字段为空(推荐,适合无需强制填写的场景)
修改models.py中的Kurs模型,给新字段添加null=True和blank=True:
from django.db import models from django.utils import timezone class Kurs(models.Model): name = models.CharField(max_length=200) beschreibung = models.TextField(null=True, blank=True) # 添加课程时间字段 start_date = models.DateField(null=True, blank=True) end_date = models.DateField(null=True, blank=True) start_time = models.TimeField(null=True, blank=True) end_time = models.TimeField(null=True, blank=True) updated = models.DateTimeField(auto_now=True) created = models.DateTimeField(auto_now_add=True) def __str__(self): return self.name
数据库会给现有行的新字段填充NULL,后续可在Admin面板补填内容。
方案2:设置默认值(适合需给现有行自动填充值的场景)
如果希望给已有课程自动设置默认时间,可定义默认规则(比如默认开始日期为今天,结束日期为7天后,开始时间9点,结束时间17点):
from django.db import models from django.utils import timezone from datetime import timedelta def default_end_date(): return timezone.now().date() + timedelta(days=7) def default_start_time(): return timezone.datetime(2000, 1, 1, 9, 0).time() # 固定9点 def default_end_time(): return timezone.datetime(2000, 1, 1, 17, 0).time() # 固定17点 class Kurs(models.Model): name = models.CharField(max_length=200) beschreibung = models.TextField(null=True, blank=True) start_date = models.DateField(default=timezone.now) end_date = models.DateField(default=default_end_date) start_time = models.TimeField(default=default_start_time) end_time = models.TimeField(default=default_end_time) updated = models.DateTimeField(auto_now=True) created = models.DateTimeField(auto_now_add=True) def __str__(self): return self.name
三、执行数据库迁移
在项目根目录下运行命令:
python manage.py makemigrations python manage.py migrate
方案1执行时无额外提示;方案2可能需要确认默认值,直接按回车即可。
四、配置Admin面板显示
在admin.py中自定义Kurs模型的Admin界面,将日期时间字段分组显示:
from django.contrib import admin from .models import Kurs class KursAdmin(admin.ModelAdmin): # 列表页显示的字段 list_display = ('name', 'start_date', 'end_date', 'start_time', 'end_time', 'created') # 编辑页字段分组布局 fieldsets = ( (None, { 'fields': ('name', 'beschreibung') }), ('课程时间设置', { 'fields': ('start_date', 'end_date', 'start_time', 'end_time') }), ('系统自动记录', { 'fields': ('created', 'updated'), 'classes': ('collapse',) # 可折叠面板 }), ) # 禁止编辑自动生成的时间字段 readonly_fields = ('created', 'updated') admin.site.register(Kurs, KursAdmin)
这样编辑页面会把日期时间字段单独分组,和你期望的显示效果一致。
内容的提问来源于stack exchange,提问作者Nikowolf123
相关产品推荐
相关产品推荐

