You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 01:47:05