关于Django字段类型DateTimeField默认是不是不能为空的测试【DateTimeField学习过程记录】

news2024/12/24 1:19:32

chatgpt说这个字段默认情况下: blank=Falsenull=False,也就是在数据库层面和表单层面都不能为空,我们不妨来测试一下在数据库层面是不是这样。
沿用博文 https://blog.csdn.net/wenhao_ir/article/details/135499962的配置。

模型代码如下:

from django.db import models


class User(models.Model):
    username = models.CharField(max_length=4)
    post_time = models.DateTimeField(verbose_name='发布时间')

    # 其他字段...

    def __str__(self):
        return self.username

在运行命令 manage.py makemigrations 时,报下面的错:

You are trying to add a non-nullable field 'post_time' to user without a default; we can't do that (the database needs something to populate existing rows).
Please select a fix:
 1) Provide a one-off default now (will be set on all existing rows with a null value for this column)
 2) Quit, and let me add a default in models.py
Select an option:

这个错误是由于你尝试向现有的数据库表(User模型)中添加一个非空字段(post_time字段),而该字段没有默认值。由于已有的数据库表中已经存在数据,Django 不知道如何为这个新字段提供默认值,因此它要求你在迁移过程中选择一种方式来解决这个问题。

在你的情况下,当你运行 manage.py makemigrations 时,Django 检测到你添加了一个非空字段 post_time,但没有提供默认值。现在,Django 要求你选择一种方式来处理现有的数据。

你可以选择以下其中一种选项:

  1. 提供一个一次性的默认值 (1): 选择这个选项,Django 将为已存在的行设置一个默认值。你需要输入一个合适的默认时间值,该值将被应用到所有已有的行。

  2. 退出,并允许我在 models.py 中添加默认值 (2): 选择这个选项,你将手动在 models.py 中为新字段提供默认值,然后再运行 makemigrations。这样,Django 将在生成迁移文件时使用你提供的默认值。

在你的模型中,如果你希望 post_time 字段可以为空,你可以在模型字段中添加 null=Trueblank=True,并确保你的数据库迁移文件中有这些更改。这样,Django 将允许在数据库中存储 null 值,而不需要提供默认值。

from django.db import models


class User(models.Model):
    username = models.CharField(max_length=4)
    email = models.EmailField(unique=True)
    post_time = models.DateTimeField(verbose_name='发布时间')

    # 其他字段...

    def __str__(self):
        return self.username

如果你选择提供一次性的默认值,Django 会在生成的迁移文件中为你处理这个默认值。如果选择退出并手动在 models.py 中添加默认值,你需要在模型中设置默认值,然后再运行 manage.py makemigrations

从这里就可以看出默认情况下这个的确是非空值的。出现上面的原因是我是在原有的数据库表的基础上升级数据库表,这导致原来已经存在的一些行是没有数据的。原来的表的情况如下:
在这里插入图片描述
在这里我们选择 1) Provide a one-off default now (will be set on all existing rows with a null value for this column)
在这里插入图片描述
在这里插入图片描述
需要输入一个默认值作为默认值,这里就根据建议用当前时间作为默认值,所以输入:timezone.now
在这里插入图片描述
从这一步的操作再一次应证了DateTimeField字段默认情况下是非空的。

然后执行迁移:

manage.py migrate

在这里插入图片描述
此时发现之前存在的行已经被添加默认值了:
在这里插入图片描述
此时我们手动插入一条数据,我们首先试下在插入时对于DateTimeField字段留空,看能不能正常运行:

# 创建一个用户
user = User(username='名字02', email='a003@example.com')
user.save()

在这里插入图片描述
可见,报错了,这里就证明了DateTimeField字段默认情况下是不能留空的。

正确的插入代码如下:

import os
import django
from django.utils import timezone

# 设置Dango运行时需要的环境变量DJANGO_SETTINGS_MODULE
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myshop.settings')

# 加载Django的设置
django.setup()

# 导入模型,注意必须在加载完Django的设置后下面的这句导入模型语句才能被正确执行
from app1.models import User

# # 清空User数据表
# User.objects.all().delete()
#
# print('Successfully written data to the database.')


time01 = timezone.datetime(2024, 1, 9, 14, 24, 23)
time01_aware = timezone.make_aware(time01)  # 添加setting.py中设置的时区信息

# 创建一个用户
user = User(username='名字06', email='a006@example.com', post_time=time01_aware)
user.save()

运行效果如下:

在这里插入图片描述
但是这个时区是标准时区,如何设置为北京时间的时区呢?
经过我自己各种实测操作,都不行…

不过我觉得这一点对于我的网站来说并不重要,实在不行,可以把时间值取出来后,加上8个小时调整为北京时间嘛。

相关代码如下:

import os
import django
from datetime import timedelta

# 设置Dango运行时需要的环境变量DJANGO_SETTINGS_MODULE
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myshop.settings')

# 加载Django的设置
django.setup()

# 导入模型,注意必须在加载完Django的设置后下面的这句导入模型语句才能被正确执行
from app1.models import User

# # 清空User数据表
# User.objects.all().delete()
#
# print('Successfully written data to the database.')

# 查询并获取id为9的行
user_instance = User.objects.get(id=9)

# 获取post_time字段的值
post_time_value = user_instance.post_time

# 假设 post_time_value 是你从数据库中获取到的 UTC 时间
utc_time = post_time_value

# 添加8小时
beijing_time = utc_time + timedelta(hours=8)

# 打印结果或进行其他操作
print(beijing_time)

运行效果如下:
在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1372666.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

科大讯飞星火大模型加持数字员工系列产品发布

面对时代浪潮,基业长青的企业总会率先拥抱变化,在时代交替中创造新的增长空间。当数字化浪潮涌入千行百业,企业掌舵者如何选择转型? 从数字员工到灯塔工厂,愈发成熟的人工智能技术已深入企业管理,持续提高…

Python3 安装教程(windows)

Python (官网)是这两年来比较流行的一门编程语言。相对简单的语法以及丰富的第三方库。 步骤有三步: 1.下载 Python 安装包 2.安装 Python 3.查验是否安装成功 一.下载 Python 安装包 (Python、Sublime 官方下载地址是外国的服…

「超级细菌」魔咒或将打破,MIT 利用深度学习发现新型抗生素

作者:加零 编辑:李宝珠、三羊 MIT 利用图神经网络 Chemprop 识别潜在抗生素,特异性杀死鲍曼不动杆菌。 自然界中充满了各种各样的微生物,例如结核杆菌(导致肺结核)、霍乱弧菌(导致霍乱&#…

1991-2022年A股上市公司股价崩盘风险指标数据

1991-2022年A股上市公司股价崩盘风险指标数据 1、时间:1991-2022年 2、来源:整理自csmar 3、指标:证券代码、交易年度、NCSKEW(分市场等权平均法)、NCSKEW(分市场流通市值平均法)、NCSKEW(分市场总市值平均法); NCSKEW(综合市…

Android开发基础(一)

Android开发基础(一) 本篇主要是从Android系统架构理解Android开发。 Android系统架构 Android系统的架构采用了分层的架构,共分为五层,从高到低分别是Android应用层(System Apps)、Android应用框架层&a…

最新GPT4、AI绘画、DALL-E3文生图模型教程,GPT语音对话使用,ChatFile文档对话总结

一、前言 ChatGPT3.5、GPT4.0、GPT语音对话、Midjourney绘画,文档对话总结DALL-E3文生图,相信对大家应该不感到陌生吧?简单来说,GPT-4技术比之前的GPT-3.5相对来说更加智能,会根据用户的要求生成多种内容甚至也可以和…

Vue 自定义仿word表单录入之单选按钮组件

因项目需要&#xff0c;要实现仿word方式录入数据&#xff0c;要实现鼠标经过时才显示编辑组件&#xff0c;预览及离开后则显示具体的文字。 鼠标经过时显示 正常显示及离开时显示 组件代码 <template ><div class"pager-input flex border-box full-width fl…

006集 正则表达式 re 应用实例—python基础入门实例

正则表达式指预先定义好一个 “ 字符串模板 ” &#xff0c;通过这个 “ 字符串模 板” 可以匹配、查找和替换那些匹配 “ 字符串模板 ” 的字符串。 Python的中 re 模块&#xff0c;主要是用来处理正则表达式&#xff0c;还可以利用 re 模块通过正则表达式来进行网页数据的爬取…

monocle2 fibroblast silicosis inmt

gc() #####安装archr包##别处复制 .libPaths(c("/home/data/t040413/R/x86_64-pc-linux-gnu-library/4.2","/home/data/t040413/R/yll/usr/local/lib/R/site-library", "/usr/local/lib/R/library","/home/data/refdir/Rlib/")).libPa…

Every Nobody Is Somebody 「每小人物都能成大事」

周星驰 NFT Nobody即将发售&#xff0c;Nobody共创平台 Every Nobody Is Somebody Nobody 关于Nobody&#xff1a;Nobody是一款Web3共创平台&#xff0c;旨在为创作者提供一个交流和合作的场所&#xff0c;促进创意的产生和共享。通过该平台&#xff0c;创作者可以展示自己的作…

Vue3-46-Pinia-获取全局状态变量的方式

使用说明 在 Pinia 中&#xff0c;获取状态变量的方式非常的简单 &#xff1a; 就和使用对象一样。 使用思路 &#xff1a; 1、导入Store&#xff1b;2、声明Store对象&#xff1b;3、使用对象。 在逻辑代码中使用 但是 Option Store 和 Setup Store 两种方式定义的全局状态变量…

STK 特定问题建模(五)频谱分析(第二部分)

文章目录 简介三、链路分析3.1 星地链路干扰分析3.2 频谱分析 简介 本篇对卫星通信中的频谱利用率、潜在干扰对频谱的影响进行分析&#xff0c;以LEO卫星信号对GEO通信链路影响为例&#xff0c;分析星地链路频谱。 建模将从以下几个部分开展&#xff1a; 1、GEO星地通信收发机…

2024年了,Layui再战三年有问题不?

v2.9.3 2023-12-31 2023 收官。 form 优化 input 组件圆角时后缀存在方框的问题 #1467 bxjt123优化 select 搜索面板打开逻辑&#xff0c;以适配文字直接粘贴触发搜索的情况 #1498 Sight-wcgtable 修复非常规列设置 field 表头选项时&#xff0c;导出 excel 出现合计行错位的…

实习学习总结(2023-12-14---2024-1-08)

CS汉化 首先下载CSagent&#xff0c;百度网盘中有 按照如下放置目录 使用出现中文乱码 插件使用乱码主要跟cs客户端加载没有指定UTF-8编码有关 指定编码的字符&#xff1a;-Dfile.encodingUTF-8 上面的字段添加到启动脚本里面即可&#xff0c;如&#xff1a; java -Dfile.e…

CHS_03.1.3.3+系统调用

CHS_03.1.3.3系统调用 系统调用什么是系统调用&#xff0c;有何作用&#xff1f;系统调用又和普通的库函数的调用又有一定的区别为什么系统调用是必须的系统调用 按功能分类 可以分为这样的一些系统调用系统调用过程 这个小节的全部内容 系统调用 相关的知识 我们会为大家介绍什…

2024-01-01 K 次取反后最大化的数组和和加油站以及根据身高重建队列

1005. K 次取反后最大化的数组和 思路&#xff1a;每一次取反最小值即可&#xff01;贪心的思路就是先排序&#xff0c;反转负数的值&#xff0c;后在贪心反转最小值 class Solution:def largestSumAfterKNegations(self, nums: List[int], k: int) -> int:count 0while …

Python冒号的解释

1. “没什么首次没有为第二个&#xff0c;跳了三个”。它得到的切片序列的每一个第三个项目。 扩展片是你想要的。新在Python 2.3 2. Python的序列切片地址可以写成[开始&#xff1a;结束&#xff1a;一步]和任何启动&#xff0c;停止或结束可以被丢弃。a[::3]是每第三个序列。…

插入排序-排序算法

前言 在玩斗地主的时候&#xff0c;你是如何理牌的&#xff1f; 当我们手中没扑克牌时&#xff0c;不管抓的是什么牌&#xff0c;都是放到手里。其他时候拿到一张牌&#xff0c;是从右向左找一个位置&#xff1a;右边是大于这张牌&#xff0c;左边是小于等于这张牌或者左边没有…

全国的地矿分布哪里可以查到,包括经纬度坐标等信息

全国矿产地分布&#xff08;2021版&#xff09; 数据来源&#xff1a; 全国矿产地数据库2021版 (ngac.org.cn) http://data.ngac.org.cn/mineralresource/index.html 进入网站后&#xff0c;可以自由选择图层来展示10类不同的矿产分布 还可通过查询条件&#xff0c;显示所需…

Kubernetes实战(十五)-Pod垂直自动伸缩VPA实战

1 介绍 VPA 全称 Vertical Pod Autoscaler&#xff0c;即垂直 Pod 自动扩缩容&#xff0c;它根据容器资源使用率自动设置 CPU 和 内存 的requests&#xff0c;从而允许在节点上进行适当的调度&#xff0c;以便为每个 Pod 提供适当的资源。 它既可以缩小过度请求资源的容器&…